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和应用程序之间的过滤结果不同的主要内容,如果未能解决你的问题,请参考以下文章