Django Unioned QuerySets上的.filter()给出了错误的结果

时间:2017-09-07 00:31:06

标签: django python-3.x django-models

我有一个名为th的模型,其中包含Eventstart字段,两者都属于stop类型。我想过滤掉具有空DateTimeFieldstart字段的事件。

使用这两个查询,我得到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 字符合并两个查询集,则此筛选的查询可以正常工作。我理解|允许这种合并行为。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

答案 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。