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

时间:2018-04-09 17:24:14

标签: django filter orm

关于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

壳查询:

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

结果:

  • 有关filter-query =&gt;请参阅第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 个答案:

答案 0 :(得分:0)

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

似乎与以下问题有关:

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