【问题标题】:Django ORM: exclude does not return expected resultDjango ORM:排除不返回预期结果
【发布时间】:2018-02-13 08:38:51
【问题描述】:

Django 1.11.4

我只想选择丢失物品的框架。 如果物品丢失,lost_day 不为空。

问题:如果出现“错误结果”,我无法理解发生了什么。我想说,它应该返回与 “正确结果” 相同的结果。你能帮我弄清楚它有什么问题吗?

错误的结果

>>> Frame.objects.all().exclude(item__lost_day__isnull=True)
    <QuerySet [<Frame: 3>]>

正确结果:

>>> Frame.objects.all().filter(item__lost_day__isnull=False)
    <QuerySet [<Frame: 1>, <Frame: 3>]>

自检

>>> a = Item.objects.get(pk=1)
>>> a.lost_day
datetime.date(1997, 1, 1)
>>> a.lost_day is None
False

>>> b = Item.objects.get(pk=2)
>>> b.lost_day
datetime.date(1997, 2, 2)
>>> b.lost_day is None
False

models.py

class Frame(models.Model):
    pass

class Item(models.Model):
    frame = models.ForeignKey(Frame,
                          blank=False,
                          on_delete=models.PROTECT,
                          verbose_name=_("frame"))
    lost_day = models.DateField(auto_now=False,
                                auto_now_add=False,
                                blank=True,
                                null=True,
                                verbose_name=_("lost"))

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    你能不能展示一下:

    Frame.objects.filter(pk=1).values('item__lost_day')
    

    看起来你有空而不是lost_day的多重引用,所以我们有

    [{'item__lost_day': None},
     {'item__lost_day': datetime.date(1997, 1, 1)},
     {'item__lost_day': None}]
    

    当您查询Frame.objects.exclude(item__lost_day__isnull=True) 时,djanqo 会获取所有没有item__lost_day__isnull 的frames,这是框架pk=3 它有空值,但不是frame &lt;1&gt;

    当你 Frame.objects.filter(item__lost_day__isnull=False) 然后 django 找到所有 frames 不为空 lost_day 并且它们是 1 和 3 == 没问题。

    你研究中最麻烦的是你改变条件(null,not_null)和方法(过滤器,排除)一起。

    【讨论】:

    • 结果将是:
    • 对不起,我的逻辑错了,需要检查pk=1,试试看,希望对你有帮助
    • 结果是:Frame.objects.filter(pk=1).values('item__lost_day') 嗯,确实是多个引用,但没有值。我仍然无法抓住这个想法。你能解释一下,这是怎么回事吗?
    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多