Django: Как создать модель, содержащую внешний ключ, с помощью CreateView?

Если возможно, я хочу сделать модель, включающую внешний ключ, с помощью CreateView на основе класса. Я знаю, что это можно сделать с помощью функции.

models.py

class Pizza(models.Model):
    name = models.CharField(max_length=20)
    def __str__(self):
      return self.name
    def get_absolute_url(self):
      return "/pizzas"

class Topping(models.Model):
    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    def __str__(self):
      return self.name
    def get_absolute_url(self):
       return reverse("pizza", kwargs={"pizza_id": self.pizza.pk})

views.py

class NewTopping(CreateView):
    model = Topping
    template_name = "pizzas/new_topping.html"
    form_class = ToppingForm

urls.py

path("topping/<pk>/create",views.NewTopping.as_view(),name="new_topping")

Я пытался сделать это следующим образом, но я получаю ошибку целостности, когда пытаюсь сохранить новый экземпляр:

NOT NULL constraint failed: pizzas_topping.pizza_id

С логической точки зрения, я бы предложил вам изменить ваши модели, потому что пицца может содержать несколько начинок, а начинка может быть на нескольких пиццах. Поэтому я бы предложил добавить поле ManyToManyField "toppings" в модель Pizza и удалить ForeignKeyField модели Pizza в модели Topping (см. код ниже). Если вы реализуете это в своих моделях, то, возможно, столкнетесь с проблемами.

Каждый объект в таблице Topping связан только с одним объектом Pizza. Поэтому если в качестве топпинга используется, например, томатный соус, необходимо добавить несколько объектов с именем 'tomato sauce', каждый из которых связан с отдельным типом пиццы. Если у вас есть, например, 'Pizza Margherita', 'Pizza Funghi' и 'Pizza Prosciutto' в качестве экземпляров пиццы, у вас должно быть три экземпляра 'tomato sauce' в таблице Topping в базе данных, потому что на каждой из трех пицц есть томатный соус.

За кулисами Django создает промежуточную таблицу join для представления отношений "многие-ко-многим".

Итак, с помощью поля ManyToManyField Django создает таблицу (которую вы не видите как представление модели), которая хранит - в вашем случае и с моим предложением - ID пиццы и ID топпинга. Для дальнейшего объяснения ManyToManyFields, ознакомьтесь с Django Documentation

#models.py
class Pizza(models.Model):
    name = models.CharField(max_length=20)
    toppings = models.ManyToManyField(Topping)
    ...

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

На ваш вопрос вы должны предоставить файл forms.py и, возможно, ваш HTML-шаблон. В противном случае невозможно ответить на ваш вопрос.

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