Фильтровать набор запросов в наборе форм django inline на основе атрибута сквозной модели

У меня есть базовое приложение для отслеживания инвентаризации в ресторане, которое позволяет пользователю создавать ингредиенты, меню и пункты меню. Для каждого пункта меню пользователь может перечислить необходимые ингредиенты для этого пункта вместе с количеством, необходимым для каждого ингредиента для этого пункта.

Пункты меню имеют отношения "многие-ко-многим" с ингредиентами и связаны через сквозную таблицу "IngredientQuantity".

Вот мои модели:

class Ingredient(models.Model):
    GRAM = 'Grams'
    OUNCE = 'Ounces'
    PIECE = 'Pieces'

    UNIT_CHOICES = [
        ('Grams', 'Grams'),
        ('Ounces', 'Ounces'),
        ('Pieces', 'Pieces')
    ]

    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) 
    name = models.CharField(max_length=200)
    unitType = models.CharField(max_length=200, choices=UNIT_CHOICES, verbose_name='Unit')
    unitCost = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Unit Cost')
    inventoryQuantity = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Quantity')

    def __str__(self):
        return self.name + ' (' + self.unitType + ')'

    def totalCost(self):
        result = self.inventoryQuantity * self.unitCost
        return "{:.0f}".format(result)

class Menu(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) 
    name = models.CharField(max_length=200)
    timeCreated = models.DateTimeField(auto_now_add=True)
    timeUpdated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.name)

class MenuItem(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    ingredients = models.ManyToManyField(Ingredient, through='IngredientQuantity')
    menu = models.ForeignKey(Menu, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

    def itemCost(self):
        relevantIngredients = IngredientQuantity.objects.filter(menuItem=self)
        cost = 0

        for ingredient in relevantIngredients:
            cost += (ingredient.ingredient.unitCost * ingredient.ingredientQuantity)

        return cost

class IngredientQuantity(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) 
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    menuItem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    ingredientQuantity = models.IntegerField(default=0)

    def __str__(self):
        return str(self.ingredient)

Это многопользовательское приложение, поэтому, когда пользователь создает новый пункт меню и добавляет в него ингредиенты, у него должна быть возможность выбирать только те ингредиенты, которые он создал, а не ингредиенты других пользователей. Вот моя попытка сделать это в моих представлениях:

def ItemUpdate(request, pk):
    item = MenuItem.objects.get(id=pk)
    user = request.user

    IngredientQuantityFormset = inlineformset_factory(
        MenuItem, IngredientQuantity, fields=('ingredient', 'ingredientQuantity'), can_delete=True, extra=0
    )

    form = ItemCreateForm(instance=item)
    formset = IngredientQuantityFormset(instance=item, queryset=IngredientQuantity.objects.filter(ingredient__user=user))

    if request.method == 'POST':
        form = ItemCreateForm(request.POST, instance=item)
        formset = IngredientQuantityFormset(request.POST, instance=item, queryset=IngredientQuantity.objects.filter(ingredient__user=user))

# rest of view...

Я везде искал, как правильно реализовать параметр queryset, но не могу заставить его работать. При создании пункта меню пользователь может выбрать любой ингредиент из базы данных (включая те, что созданы другими пользователями). Я бы хотел, чтобы пользователь мог выбирать только из тех ингредиентов, которые он сам создал.

Кто-нибудь знает, как это правильно сделать? Спасибо!

Я получил некоторые рекомендации на форумах Django и пришел к решению, которое документировано ниже:

https://forum.djangoproject.com/t/filter-dropdown-options-in-django-inline-formset-based-on-attribute-of-through-model/13374/3

Вернуться на верх