DateTimeField 查询集在 Django 中返回 None

Posted

技术标签:

【中文标题】DateTimeField 查询集在 Django 中返回 None【英文标题】:DateTimeField queryset returning None in Django 【发布时间】:2014-08-24 07:03:28 【问题描述】:

我正在尝试创建一个查询集以获取数据库中的 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)

数据库中的字段:

date DATETIME

元组填充在数据库中,直接在数据库上运行 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 获取值,但没有成功。

对可能出现的问题有任何想法吗?

【问题讨论】:

如果你自己查询空日期会怎样? 不幸的是,结果相同。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

在将代码从本地环境 (Mac OS X) 推送到 App Engine 时,我们遇到了同样的问题。虽然像 Alexander 提到的将字段更改为 DATETIME 而不是 DATETIME(6) 确实开始使它们出现,但我们丢失了微秒。最终意识到在本地环境中我们正在运行 MySQLdb 1.2.5,但是在部署到 App Engine 时,即使我们指定了“最新”作为 MySQLdb 的版本,它也只是拉 1.2.4b4,硬编码到 1.2.5解决了这个问题。

【讨论】:

我在相同的本地/生产环境中遇到了这个问题。你的修复就像一个魅力。不知道应用引擎拉的是 1.2.4b4 而不是 1.2.5。非常感谢@jturmel!【参考方案3】:

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

因此,Django 迁移在数据库中将列创建为 datetime(6) 而不是 datetime。这导致 Django 模型无法实例化 Datetime 对象。

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

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

【讨论】:

在我的情况下,该列只是datetime,但这仍然解决了问题。谢谢!【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

试过了。我不认为查询本身有问题......现在我认为模型和数据库之间的链接有问题。 试过了。并运行一个新的 inspectdb > models.py 来生成一个新的模型文件,仍然返回 None。我现在正在检查数据库的表代,看看是否可能存在错误。【参考方案6】:

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

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

【讨论】:

我得到与您的查询相同的结果。我可以补充一点,查询返回数据库的正确元组,即在指定字段中没有 null 的元组。只是由于某种原因它没有获取日期的值。 请展示你的完整models.py 我的意思是完整的ChangeMetricsclass 请在您的问题中添加上述评论@user3063424 我已将其添加到主帖中。 没有changed这样的属性

以上是关于DateTimeField 查询集在 Django 中返回 None的主要内容,如果未能解决你的问题,请参考以下文章

构造函数中的 Django ModelMultipleChoiceField 更新查询集在 POST 上失败

求教Django中model类型为DateTimeField在查询时的问题

Django - DetailView 中的 DateTimeField

在 Django 中检索时区感知 DateTimeField

Django —— DateTimeField格式

django--DateTimeField字段orm操作