如何使用django多表继承有条​​件地保存表单

时间:2013-10-03 04:24:42

标签: django inheritance django-models django-forms multi-table-inheritance

我有以下表格:

类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()

在我看来,我想根据收到的网址有条件地保存一个地方或一个餐馆。

我尝试了以下内容:

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
  3. 如何有条件地完成保存不同的父对象和子对象?

2 个答案:

答案 0 :(得分:1)

它与Django model inheritance: create sub-instance of existing instance (downcast)?有关,它建议如何使用现有的基类对象添加对象。

您可能需要查看我的问题:Derived model filefield not available


简而言之,你要做的是

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

答案 1 :(得分:0)

您可以添加null=Trueblank=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)