【问题标题】:DateTimeField queryset returning None in DjangoDateTimeField 查询集在 Django 中返回 None
【发布时间】: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 获取值,但没有成功。

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

【问题讨论】:

  • 如果你自己查询空日期会怎样?
  • 不幸的是,结果相同。

标签: python django sqlite django-models django-views


【解决方案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这样的属性
      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2021-04-10
      • 2020-07-09
      • 2020-10-08
      • 2021-08-12
      • 2021-11-30
      相关资源
      最近更新 更多