我有一个名为th
的模型,其中包含Event
和start
字段,两者都属于stop
类型。我想过滤掉具有空DateTimeField
和start
字段的事件。
使用这两个查询,我得到2个QuerySets:
stop
我试过这样的联盟:
tempset = Event.objects.filter(site__slug='test-site', owner__email='bill@email.com')
tempset2 = Event.objects.filter(site__slug='test-site', invite__slug='bill-compton')
以及像这样:
tempset.union(tempset2)
但是当我尝试使用以下语法进行过滤时:
tempset = Event.objects.filter(site__slug='test-site', owner__email='bill@email.com').union(Event.objects.filter(site__slug='test-site', invite__slug='bill-compton'))
然后打印出开始和结束值,
filtered_query = tempset.filter(start__isnull=False, stop__isnull=False)
我得到了这个输出:
for thing in filtered_query:
print(thing.start, thing.stop)
注意:
如果我使用None None
2017-09-01 11:00:25+00:00 None
2017-09-03 11:00:00+00:00 2017-09-03 12:00:00+00:00
2017-09-06 11:00:00+00:00 2017-09-06 12:00:00+00:00
2017-09-06 11:00:54+00:00 2017-09-06 12:00:54+00:00
2017-09-06 11:00:07+00:00 2017-09-06 12:00:07+00:00
字符合并两个查询集,则此筛选的查询可以正常工作。我理解|
允许这种合并行为。
有什么想法吗?
答案 0 :(得分:0)
看看Q对象。它可以让您做到所需:https://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q-objects
答案 1 :(得分:0)
尝试查看查询print(filtered_query.query)
。最有可能的是,过滤不会添加到QuerySet中。也许此故障单描述了同样的问题:https://code.djangoproject.com/ticket/28519。
据我所知,现在可以做的就是在合并之前过滤数据(如果你想要使用UNION
):
filtered_query = (
Event
.objects
.filter(site__slug='test-site', owner__email='bill@email.com', start__isnull=False, stop__isnull=False)
.union(Event.objects.filter(site__slug='test-site', invite__slug='bill-compton', start__isnull=False, stop__isnull=False))
)
如果我使用|要合并两个查询集的字符,这个已过滤 查询工作正常。
|
将QuerySets的WHERE
条件合并为单SELECT
,但.union()
合并了两个查询的结果(两个SELECT
)。比较两种变体的SQL。