Как записать данные FK на две другие модели?

На примере 'Pizza' у меня есть модель Toppings, у меня есть модель PizzaTemplate и 'Pizza', и теперь мне нужно записать количество топпингов для каждой пиццы.

Например, у меня есть "Пицца Пепперони", мне нужно записать 1 мерную ложку сыра, 1 мерную ложку пепперони. Затем у меня может быть "Пицца Пепперони - Экстра Пепперони", которая будет состоять из 1 мерной ложки сыра и 2 мерных ложек пепперони, в ней используется тот же набор начинок, который уже определен, мне просто нужно записать количество каждой из них.

Мой текущий models.py выглядит следующим образом:

class Topping(models.Model):
    name = models.CharField(max_length=100)
    unit = models.CharField(max_length=100)


class PizzaTemplate(models.Model):
    name = models.CharField(max_length=100)
    toppings = models.ManyToManyField(Topping)


class Pizza(models.Model):
    name = models.CharField(max_length=100)

Я предполагаю, что мне нужна другая модель, например, такая:

class Ingredients(models.Model):
    pizza = models.ForeignKey(Pizza)
    topping = models.ForeignKey(Topping)
    amount = models.IntegerField()

Я не уверен, является ли это правильным способом достижения этой цели или есть более умный способ?

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

Моей идеей было динамически создавать форму для каждого ввода при загрузке страницы, например, получать список начинок и генерировать для каждой из них метку иamp; поле ввода, но чем больше я иду по этому пути, тем больше мне кажется, что я иду против зерна и, возможно, есть лучший/более очевидный метод.

Я смотрел на https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships, но я не уверен, что это полностью относится к тому, что я пытаюсь сделать.

Вы можете попробовать использовать модельные формы.

https://docs.djangoproject.com/en/4.1/topics/forms/modelforms/

class PizzaForm(forms.ModelForm):
    class Meta:
        model = Pizza
        fields = ('name',)

class IngredientsForm(forms.ModelForm):
    pizza = forms.ModelChoiceField(queryset=PizzaTemplate.objects.all())
    toppings = forms.ModelMultipleChoiceField(queryset=Topping.objects.all(), widget=forms.CheckboxSelectMultiple())

    class Meta:
        model = Ingredients
        fields = ('pizza', 'toppings', 'amount')

В вашем представлении, вы можете использовать эти формы для создания новой пиццы и указания ингредиентов для пиццы.

from django.shortcuts import render
from .forms import PizzaForm, IngredientsForm

def create_pizza(request):
    if request.method == 'POST':
        pizza_form = PizzaForm(request.POST)
        ingredients_form = IngredientsForm(request.POST)
        if pizza_form.is_valid() and ingredients_form.is_valid():
            pizza = pizza_
Вернуться на верх