关于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)
数据库:
壳查询:
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
结果:
应用程序查询:
@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)
结果:
我的问题:
1)结果差异的原因是什么?
2)我如何正确解决这个问题?我在很多方面调试它,但没有掌握这个问题。
注意:我尝试使用不同的过滤器查询并遇到了相同的问题。
答案 0 :(得分:0)
答案很难被发现。我使用的调试器在ORM查询(以前工作正常)方面无法正常工作。我使用VS代码1.22.1 + Django 2.0。无法使用我的调试器解决问题,但在使用manage.py的runserver cmd运行时,代码实际上工作正常。
似乎与以下问题有关: