如何使用标准 django 过滤器访问加入“中间”表?
Posted
技术标签:
【中文标题】如何使用标准 django 过滤器访问加入“中间”表?【英文标题】:How can I access join "intermediate" table using standard django filter? 【发布时间】:2021-11-05 22:09:39 【问题描述】:假设我知道食谱及其成分,我如何获得 RecipeIngredient 实例的特定查询集?一直在尝试使用以下代码:
RecipeIngredient.objects.filter(recipe=recipe, ingredient__in=recipe.ingredients.all())
但它返回一个实例的查询集,而不是多个。
class Recipe(models.Model):
name = models.CharField(max_length=200, verbose_name='Name of a recipe')
ingredients = models.ManyToManyField(
'Ingredient',
through='RecipeIngredient',
verbose_name='Ingredients of a recipe'
)
class Ingredient(models.Model):
name = models.CharField(
max_length=256,
verbose_name='Name of an ingredient'
)
class RecipeIngredient(models.Model):
recipe = models.ForeignKey(
'Recipe',
on_delete=models.CASCADE
)
ingredient = models.ForeignKey(
'Ingredient',
on_delete=models.CASCADE
)
amount = models.IntegerField(
validators=[
MinValueValidator(1),
MaxValueValidator(44640)
],
verbose_name='Amount of ingredients'
)
【问题讨论】:
【参考方案1】:我不确定,但请尝试一下。
首先创建一个新类,如:
class RecipeIngredientManager(models.Manager):
def function_name(self):
return self.filter(recipe=recipe, ingredient__in=recipe.ingredients.all())
然后在 RecipeIngredient 类中执行此操作:
objects = ProductManager()
完成所有操作后,makemigration 和 migrate:
python manage.py makemigrations
python manage.py migrate
【讨论】:
以上是关于如何使用标准 django 过滤器访问加入“中间”表?的主要内容,如果未能解决你的问题,请参考以下文章
django系列8.4--django中间件的可应用案例, 限制请求次数与时间