как условно сохранить форму, используя наследование нескольких таблиц 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. Условно измените тип модели формы на «Место» или «Ресторан».

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


person Atma    schedule 03.10.2013    source источник
comment
Возможный дубликат stackoverflow.com/questions/4064808/   -  person Rohan    schedule 03.10.2013
comment
Это связано с расширением пользователя django auth. Я думаю, что это немного другое.   -  person Atma    schedule 03.10.2013


Ответы (2)


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

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


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

restaurant = Restaurant(place_ptr_id=place.id)
restaurant.__dict__.update(place.__dict__)
restaurant.save()
person Rohan    schedule 04.10.2013

Вы можете добавить 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)
person Raul Bustamante    schedule 03.10.2013