Django QuerySet联合运算符在交集后不可交换

时间:2017-12-22 17:59:39

标签: python django union django-queryset intersection

我使用python 3.4.2和django 2.0。

我的models.py

class Solution(models.Model):
    name = models.CharField(max_length=200)

然后在python控制台中我这样做:

>>>a = Solution.objects.all().filter(id="1")
>>>b = Solution.objects.all().filter(id__in=["1","2"])
>>>c = Solution.objects.all().filter(id="3")
>>>ab = a.intersection(b)
>>>abc = ab.union(c)
>>>cab = c.union(ab)
>>>abc
<QuerySet [<Solution: Solution-id1>, <Solution: Solution-id3>]>
>>>cab
<QuerySet [<Solution: Solution-id1>]>

为什么abc和bca不同?

如果我需要使用我的查询集执行许多交叉和联合操作,我该怎么办?因为我希望有

<QuerySet [<Solution: Solution-id1>, <Solution: Solution-id3>]>

以任何联合顺序。

我从用户那里获取长查询字符串。例如:

(((id 1) and (id 2)) or (id 3)) or ((id 4) and (id 5))

我在queryset上使用带有循环的递归函数来搜索结果。 但如果联盟运营商不是可交换的,我无法预测结果。 我认为我每次都可以访问基础,但是我可以在不调用数据库的情况下对查询集执行某些操作吗?

0 个答案:

没有答案