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 我的意思是完整的ChangeMetrics
class
请在您的问题中添加上述评论@user3063424
我已将其添加到主帖中。
没有changed
这样的属性以上是关于DateTimeField 查询集在 Django 中返回 None的主要内容,如果未能解决你的问题,请参考以下文章
构造函数中的 Django ModelMultipleChoiceField 更新查询集在 POST 上失败
求教Django中model类型为DateTimeField在查询时的问题
Django - DetailView 中的 DateTimeField