Python 使用Q对象时排除vs过滤器

Python 使用Q对象时排除vs过滤器,python,django,Python,Django,无法理解这是怎么可能的: A = object_list.filter( Q(sales__sale_starts__lte=today) & Q(sales__sale_ends__gte=today) ) # query inside filter catches 2 objects B = object_list.exclude( Q(sales__sale_starts__lte=today) & Q(sales__sale_ends__gte=today) ) # q

无法理解这是怎么可能的:

A = object_list.filter( Q(sales__sale_starts__lte=today) & Q(sales__sale_ends__gte=today) )
# query inside filter catches 2 objects

B = object_list.exclude( Q(sales__sale_starts__lte=today) & Q(sales__sale_ends__gte=today) )
# query inside exclude catches 3 objects,
# though it is the same as previous

# in other words: object_list contains 20 objects,
# A - 2 objects, and B - 17 objects
使用
Q
对象时,
filter()
exclude()
的工作方式有什么不同吗?谢谢

我希望
B
与以下内容相同:

B = object_list.difference(A)
# B contains 18 objects

行为应该是相同的。如果查看
.exclude()
.filter()
源代码,它们的作用相同:

def exclude(self, *args, **kwargs):
    """
    Returns a new QuerySet instance with NOT (args) ANDed to the existing
    set.
    """
    return self._filter_or_exclude(True, *args, **kwargs)

def filter(self, *args, **kwargs):
    """
    Returns a new QuerySet instance with the args ANDed to the existing
    set.
    """
    return self._filter_or_exclude(False, *args, **kwargs)
\u filter\u或
只要用
~

def _filter_or_exclude(self, negate, *args, **kwargs):
    if args or kwargs:
        assert self.query.can_filter(), \
            "Cannot filter a query once a slice has been taken."

    clone = self._clone()
    if negate:
        clone.query.add_q(~Q(*args, **kwargs))
    else:
        clone.query.add_q(Q(*args, **kwargs))
    return clone
正如保罗尔梅达所说


多值结果可能是问题所在,请参见以下两个错误报告:


因此,
filter()
exclude()
之间确实存在差异,因为sql生成不同。还有可能是
exclude()

中的bug,未捕获的对象的日期是什么?是否允许为空?@PauloAlmeida dates可以为空,filter()可以正确过滤2个对象,但exclude()排除3个对象,尽管它们具有相同的查询您没有回答其他问题,被排除的其他对象的日期是什么?@PauloAlmeida此排除对象有2个相关销售对象,1:[01.01.2018-31.01.2018]2:[01.06.2018-01.07.2018][sale_start-sale_ends]多值结果可能是问题所在,请参见以下两个错误报告:;。有一个问题,需要注意的是,它不仅仅针对
Q
对象。