【发布时间】: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)
数据库:
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)
结果:
- 查询-结果
- 实际项数:18
我的问题:
1) 结果不同的原因可能是什么?
2) 我该如何正确解决这个问题?我以多种方式对其进行了调试,但没有掌握这个问题。
注意:我尝试了不同的过滤查询并遇到了相同的问题。
【问题讨论】:
-
在两者中打印日期值,看看是否相同。