Как записать данные 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_