日历有一个所有者,并且有一个ManyToMany
字段“助手”
我有一个日历,有2位助手,其中一位是它的所有者。
我认为django shell中的这三行代码可以很好地解释怪异的行为。
In [17]: Calendar.objects.filter(assistants=customer).exclude(owner=customer)
Out[17]: <QuerySet []>
In [20]: Calendar.objects.filter(owner=customer)
Out[20]: <QuerySet [<Calendar: aliz cal>, <Calendar: yassi has a calendar>]>
In [19]: Calendar.objects.filter(owner=customer) | Calendar.objects.filter(assistants=customer).exclude(owner=customer)
Out[19]: <QuerySet [<Calendar: aliz cal>, <Calendar: aliz cal>, <Calendar: yassi has a calendar>]>
当然希望queryset join的结果是它们的实际并集。
答案 0 :(得分:1)
假设这是针对Django 1.11+:
|
不代表联合。它代表两个查询集的OR组合(维持所有连接;因此aliz出现两次)。
qs1.filter(x=1) | qs2.exclude(x=1)
转换为:
SELECT STUFF FROM TABLES_AND_JOINS WHERE (x = 1 OR NOT (x = 1))
qs1.filter(x=1).union(qs2.exclude(x=1))
转换为:
SELECT STUFF FROM TABLE1 WHERE x = 1 UNION SELECT STUFF FROM TABLE2 WHERE NOT x = 1
使用str(qs.query)
查看SQL。
答案 1 :(得分:0)