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
对象。