DateTimeField查询集在Django中返回None

我正在尝试创建一个查询集,用于获取数据库中DATETIME的DateTimeField的值 .

models.py中的类:

class ChangeMetrics(models.Model):
    id = models.IntegerField(primary_key=True)
    file_id = models.ForeignKey(File, db_column = 'file_id')
    version_id = models.ForeignKey(Version, db_column = 'version_id')
    function_id = models.ForeignKey(Function, blank=True, db_column = 'function_id')
    date = models.DateTimeField(blank=True, null=True)
    user = models.TextField(blank=True)
    changed = models.IntegerField(blank=True, null=True)

DB中的字段:

date DATETIME

元组填充在数据库中,直接在DB上运行SQL查询工作正常 .

这是我目前在Django中使用的查询集:

queryset = ChangeMetrics.objects.filter(~Q(changed=None), ~Q(date=None), ~Q(version_id=None))

我已经尝试了一个原始查询以及使用exclude()的查询版本,但是仍然为日期返回None .

我通过for循环访问查询集中的条目,只需通过for循环中的entry.date访问日期 .

编辑:Django版本1.6.5我也尝试通过Django shell获取值,但没有成功 .

关于什么可能出错的任何想法?

回答(6)

2 years ago

不确定你是否能够解决这个问题,但我遇到了这个问题,并且能够解决它 .

因此,Django迁移在DB中创建日期时间(6)而不是datetime . 这导致Django模型无法实例化Datetime对象 .

ALTER TABLE `my_table` 
MODIFY COLUMN `created` datetime NOT NULL

运行后,如果解决了我的问题 . 也许在你的情况下你可以尝试修改到datetime(6) .

2 years ago

在将代码从本地环境(Mac OS X)推送到App Engine时,我们遇到了同样的问题弹出窗口 . 虽然改变亚历山大提到的字段是DATETIME而不是DATETIME(6)确实开始让它们出现,但我们失去了微秒 . 结束时意识到在本地环境中我们运行的是MySQLdb 1.2.5但是在部署到App Engine时,即使我们已经指定“最新”作为MySQLdb的版本,它只是拉1.2.4b4,硬编码到1.2.5解决了这个问题 .

2 years ago

你能试试这个解决方案吗:

queryset = list(ChangeMetrics.objects.filter(changed__isnull=False, date__isnull=False, version_id__isnull=False))

2 years ago

编辑:尝试将数据库移出您的文件夹,然后运行 python manage.py syncdb 并检查您的数据库是否根据模型正确创建 .

不起作用:也许你可以试试这个(我不知道它是否有效,我现在不能尝试):

queryset = ChangeMetrics.objects.filter(changed!=None, date!=None, version_id!=None)

2 years ago

此问题是由 MySQL-python 的过时版本引起的,而不是由Django或迁移系统引起的 .

使用 mysqlclient (这是 MySQL-python 的更新分支)解决了这个问题 .

2 years ago

我猜你在mac上生成(django migrate命令)你的数据库模式 . 尝试删除架构并从Windows机器重新迁移 .