我在Django查询中遇到令人困惑的问题。我知道它不是错误,这是我不知道的东西。
所以模型是:
class Product(models.Model):
name = models.CharField(max_length=255)
class AttributeValue(models.Model):
value = models.CharField(max_length=255)
product = models.ForeignKey(Product, related_name='attribute_values', on_delete=models.CASCADE)
我有一个名为T-shirt的产品对象,它有两个ID为1、2的AttributeValue
。当我像这样过滤(1)时:
Product.objects.filter(Q(attribute_values__pk__in=[1, 2]))
返回我的T-shirt对象。但是当我这样过滤时(2)
Product.objects.filter(Q(attribute_values__pk__in=[1]) & Q(attribute_values__pk__in=[2]))
这里没有查询集。这是怎么回事?先前的代码只是示例,我有一个项目确实需要使用第二个过滤器(2)。
...如果为查找函数提供多个Q对象参数,则这些参数将被“与”在一起。
您希望将Q对象“或”在一起而不是“与”在一起,所以这实际上是您想要的:
Product.objects.filter(Q(attribute_values__pk__in=[1]) | Q(attribute_values__pk__in=[2]))
但是为什么不使用Q
对象却可以实现相同的目的呢?例如:
Product.objects.filter(attribute_values__pk__in=[1, 2])
编辑:
这将从不返回任何结果:
Product.objects.filter(Q(attribute_values__pk__in=[1]) & Q(attribute_values__pk__in=[2]))
# Equivalent to:
Product.objects.filter(attribute_values__pk=1).filter(attribute_values__pk=2)
为什么?因为没有对象同时拥有1
的主键和2
的主键。
在此
Product.objects.filter(Q(attribute_values__pk__in=[1]), Q(attribute_values__pk__in=[2]))
您正在使用Q表达式,并且和不会满足您的期望,因此对于预期输出也是如此:
Product.objects.filter(Q(attribute_values__pk__in=[1, 2]))
或
Product.objects.filter(Q(attribute_values__pk__in=[1]) | Q(attribute_values__pk__in=[2]))
但是您应该使用没有Q表达式的第一个