如何使用标准 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 中的过滤器访问数据

django系列8.4--django中间件的可应用案例, 限制请求次数与时间

如何通过 django 中的父表访问中间表字段?

Django:如何访问中间件类中的 URL 正则表达式参数?

django中间件

Django,从反向外键查询添加数据(外键加入过滤器)