Django中DateTimeField查询集返回None

8 投票
6 回答
6348 浏览
提问于 2025-04-18 11:58

我正在尝试创建一个查询集,用来获取数据库中一个日期时间字段(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)

数据库中的字段:

date DATETIME

这些数据已经填充到数据库中,直接在数据库上运行SQL查询是完全正常的。

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

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

我尝试过使用原始查询,也尝试过一个使用exclude()的版本,但结果仍然返回None,日期没有值。

我通过一个for循环访问查询集中的条目,并在循环中通过entry.date来获取日期。

编辑: Django版本是1.6.5 我也尝试过通过Django的命令行工具获取值,但没有成功。

有没有人知道可能出什么问题了?

6 个回答

0

这个问题是因为你用的 MySQL-python 版本太旧了,跟 Django 或者迁移系统没有关系。

使用 mysqlclient(这是 MySQL-python 的一个更新版本)可以解决这个问题。

0

编辑:试着把数据库移出你的文件夹,然后运行 python manage.py syncdb,检查一下你的数据库是否根据模型正确创建。

不管用:也许你可以试试这个(我不知道是否有效,我现在无法尝试):

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

你能试试这个解决办法吗:

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

我们在把代码从本地环境(Mac OS X)上传到App Engine时也遇到了同样的问题。按照Alexander提到的,把字段改成DATETIME而不是DATETIME(6)确实让它们显示出来了,但我们失去了微秒的信息。后来我们发现,在本地环境中我们使用的是MySQLdb 1.2.5版本,但在部署到App Engine时,尽管我们指定了“最新”版本的MySQLdb,实际上它只拉取了1.2.4b4版本。最后把版本固定为1.2.5就解决了这个问题。

4

不太确定你是否解决了这个问题,但我刚遇到这个问题,并且成功修复了。

所以,Django的迁移操作在数据库中创建了一个datetime(6)类型的列,而不是普通的datetime。这导致Django模型无法正确创建Datetime对象。

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

运行完这个之后,我的问题就解决了。也许在你的情况下,你可以尝试改成datetime(6)类型。

撰写回答