Django过滤带有Q的查询

问题描述 投票:0回答:2

我在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)。

python django django-models django-filter
2个回答
1
投票

根据documentation

...如果为查找函数提供多个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的主键。


0
投票

在此

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表达式的第一个

© www.soinside.com 2019 - 2024. All rights reserved.