Как условно сохранить форму, используя многостоловое наследование 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")
Это говорит мне о том, что новая строка для нового места пытается быть вставлена, а затем строка ресторана.
Я вижу несколько разных вариантов:
- Преобразуйте Место в ресторан и сохраните дополнительное в преобразованном объекте.
- Условно измените тип модели формы на 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)