django ORM:shell和应用程序之间的过滤结果不同

Posted

技术标签:

【中文标题】django ORM:shell和应用程序之间的过滤结果不同【英文标题】:django ORM: Filter results differ between shell and application 【发布时间】:2018-04-09 17:24:13 【问题描述】:

关于 django ORM 中的过滤器功能,我遇到了一个令人头疼的问题:

与我正在构建的实际应用程序相比,如果在 manage.py shell 中执行,过滤器函数将返回不同的值。

我尝试实现的目标: 使用 ORM 的针对外键关系的过滤器功能查询我的 sqlite 数据库中的所有条目。

a) 在 shell 中执行它返回实际的预期结果。

b) 在应用程序中以相同的方式执行它会返回一个完全不同(并且更大)的结果子集。

相关型号:

class ZeitbuchungHead(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    datum = models.DateTimeField()
    status = models.ForeignKey(ZeitbuchungStatus, related_name='zeitstatus', on_delete=models.CASCADE)

class ZeitbuchungDetail(models.Model):

    zeitbuchung_head = models.ForeignKey(ZeitbuchungHead, on_delete=models.CASCADE)
    zeit_von = models.TimeField()
    zeit_bis = models.TimeField()
    zeitbuchungsart = models.ForeignKey(ZeitbuchungArten, on_delete=models.CASCADE)

数据库:

ZeitbuchungHead

ZeitbuchungDetail

Shell 查询:

In [1]: import datetime

In [2]: from erfassung_app import models

In [3]: from django.contrib.auth.models import User

In [4]: u = User.objects.get(username='TestUser1')

In [5]: date = datetime.date.today()

In [6]: head = models.ZeitbuchungHead.objects.get(user=u, datum=date)
In [8]: details = models.ZeitbuchungDetail.objects.filter(zeitbuchung_head = head)

In [9]: print(details)
<QuerySet [<ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>, <ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>, <ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>, <ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>, <ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>, <ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>, <ZeitbuchungDetail: TestUser1 2018-04-09 00:00:00 08:00:00 09:00:00 Arbeitszeit>]>

In [10]: details_number = models.ZeitbuchungDetail.objects.filter(zeitbuchung_head = head).count()

In [11]: print(details_number)
7

结果:

过滤查询请参见第 09 行 => 正确结果 = 7 个条目。 有关条目数,请参见第 11 行。

应用程序查询:

@staticmethod
    def application_method():
        date = datetime.date.today()
        u = User.objects.get(username='TestUser1')
        head = m.ZeitbuchungHead.objects.get(user=u, datum=date)
        all_details_for_head = m.ZeitbuchungDetail.objects.filter(zeitbuchung_head = head)

结果:

查询-结果

Application-Query Result

实际项数:18

我的问题:

1) 结果不同的原因可能是什么?

2) 我该如何正确解决这个问题?我以多种方式对其进行了调试,但没有掌握这个问题。

注意:我尝试了不同的过滤查询并遇到了相同的问题。

【问题讨论】:

在两者中打印日期值,看看是否相同。 【参考方案1】:

答案不知何故难以发现。我使用的调试器在 ORM 查询方面不能正常工作(以前工作正常)。我正在使用 VS 代码 1.22.1 + Django 2.0。无法用我的调试器解决问题,但是当使用 manage.py 的 runserver cmd 运行时,代码实际上工作得很好。

似乎与以下问题有关:

https://github.com/Microsoft/vscode-python/issues/204

【讨论】:

以上是关于django ORM:shell和应用程序之间的过滤结果不同的主要内容,如果未能解决你的问题,请参考以下文章

Django之ORM

Django学习:ORM

django orm基础

Django之ORM

Django之ORM

Django中ORM介绍和字段参数