Как условно сохранить форму, используя многостоловое наследование django

У меня есть следующая форма:

Класс PlaceForm(forms.ModelForm):

class Meta:        
    model = Place

У меня есть следующие модели:

class Place(models.Model):
    customer = models.ForeignKey(Customer)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField()
    serves_pizza = models.BooleanField()

На мой взгляд, я хочу условно сохранить место или ресторан в зависимости от входящего URL.

Я пробовал следующее:

if form.is_valid():
                place = form.save(commit=False)
                place.customer = customer
                place.save()

                if url_name == 'restaurant':
                     restaurant = Restaurant(place_ptr_id=place.id)
                     restaurant.save()

Это создает место из формы, а затем пытается создать ресторан, но терпит неудачу со следующим: (1048, "Column 'customer_id' cannot be null")

Это говорит мне о том, что новая строка для нового места пытается быть вставлена, а затем строка ресторана.

Я вижу несколько разных вариантов:

  1. Преобразуйте Место в ресторан и сохраните дополнительное в преобразованном объекте.
  2. Условно измените тип модели формы на Place или Restaurant.

Как выполнить сохранение различных родительских и дочерних объектов условно?

2 ответа

Решение

Это связано с наследованием модели Django: создать субэкземпляр существующего экземпляра (downcast)? который предлагает, как добавить объект с существующим объектом базового класса.

Вы можете посмотреть на мой вопрос: поле файла производной модели недоступно


В двух словах, что вы должны сделать, это

restaurant = Restaurant(place_ptr_id=place.id)
restaurant.__dict__.update(place.__dict__)
restaurant.save()

Можете добавить null=True а также blank=True,

модели:

class Place(models.Model):
    customer = models.ForeignKey(Customer, null=True, blank=True)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)
Другие вопросы по тегам