过滤中间人 ManytoMany django 与否定



这个问题与: 过滤中介 ManytoMany django

class Ingredient(Model):
name = CharField(max_length=55, unique=True)
def __str__(self):
return self.name
class Meta:
ordering = ('name',)

class Product(Model):
name = CharField(max_length=55)
def __str__(self):
return self.name
class Meta:
ordering = ('name', )

class ProductIngredient(Model):
product = ForeignKey(Product, on_delete=CASCADE, related_name='product_ingredients')
ingredient = ForeignKey(Ingredient, on_delete=CASCADE)
optional = BooleanField(default=False)
class Meta:
unique_together = (('product', 'ingredient'),)
ordering = ('product__name',)
def __str__(self):
return f'{self.product} - {self.ingredient}'

我想做两个查询:

  • 选择所有成分不含草莓和牛奶的产品
  • 选择所有成分不含草莓或牛奶的产品

在这种情况下,我完全迷失了。

参考您链接的问题,您可以将 Q 对象与.exclude()一起使用,而不是.filter()。您还可以通过在前面加上波浪号 (~( 来否定 Q 对象:

成分不含草莓和牛奶的商品

.filter(
~Q(product__ingredients__ingredient__name='strawberry') &
~Q(product__ingredients__ingredient__name='milk')
)

成分不含草莓或牛奶的商品

.filter(~Q(product__ingredients__ingredient__name__in=['strawberry', 'milk']))

最新更新