gpt4 book ai didi

python - 关于多对多过滤和组合查询集的非常奇怪的行为

转载 作者:行者123 更新时间:2023-12-01 08:00:47 25 4
gpt4 key购买 nike

日历有一个所有者并有一个 ManyToMany 字段“assistants”我有一个日历,有 2 个助手,其中之一是它的所有者。我认为 django shell 中的这 3 行代码可以很好地解释这种奇怪的行为。

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>]>

当然希望查询集连接的结果是它们的实际并集。

最佳答案

假设这是 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。

关于python - 关于多对多过滤和组合查询集的非常奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55744147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com