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}'
我想做两个查询:
- 选择所有产品,其成分包含草莓和牛奶
- 选择所有产品,其成分包含草莓或牛奶
第一个查询是:Product.objects.prefetch_related('product_ingredients__ingredient').filter(product__ingredients__ingredient__name='strawberry').filter(product__ingredients__ingredient__name='milk')
我需要distinct
在第一个查询中写吗?如何编写第二个查询?
解决方案
使用Q 对象进行复杂的查找
Product.objects.prefetch_related('product_ingredients__ingredient').filter(Q(product__ingredients__ingredient__name='strawberry')|Q(product__ingredients__ingredient__name='milk'))
推荐阅读
- kubernetes - pvc 如何决定在 kubernetes 中绑定哪个 pv
- git - Git 分支合并在 Visual Studio 中无法正常工作
- python - 在 Python 中播放声音,并能够在播放过程中将其切断
- c - 有没有办法用 SO_KEEPALIVE 设置特定的应用程序超时,而不是取决于系统默认超时,即 C 中的 2 小时
- python - 分组还是转置?
- python - 如何在 Pandas 数据框中添加整数表示的列
- c# - 使用实体框架 C# 从数据库表中删除行数据
- javascript - 使用 vue.router 重定向到绝对路径
- android - 如何在 Android TV 中切换音频设备?
- python - (Python) 为列表中的所有对象运行函数