Django 模型继承:使用现有的超类创建子类

问题描述 投票:0回答:3

我正在使用多表继承,并且想知道如何从超类的实例创建继承类型。

使用文档中给出的示例:

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

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

现在,当您创建

Restaurant
时,您会自动创建
Place
,这很好,也是我期望和想要的行为。

但是如果我制作一个

Place
,然后决定转换为特定类型(如
Restaurant
)怎么办?如何使用现有的
Restaurant
创建
Place

django inheritance model
3个回答
32
投票

多表继承只是Place和Restaurant之间的

OneToOneField
关系。

place = Place.objects.get(id=1)               

# Create a restaurant using existing Place   
restaurant = Resturant(place_ptr=place)
restaurant.__dict__.update(place.__dict__)
restaurant.save()

13
投票
place = Place.objects.get(id=1)

# Create a restaurant using existing Place
place.__class__ = Restaurant
place.save()
restaurant = place

10
投票

虽然没有记录,但这似乎可以解决问题:

restaurant(place_ptr=place).save_base(raw=True)

这无需使用任何 hack 即可解决问题,并且是最短的解决方案,在处理方面也是如此,使用 Django API。

在寻找此解决方案时,我还发现了一个稍长的解决方案,但使用了记录的 API。与Mariusz回答基本相同,更多详情请参阅此答案

from django.forms.models import model_to_dict

restaurant(place_ptr=place, **model_to_dict(place)).save()

但是,由于 model_to_dict 返回的字段集有限,第二个风险更大(再次参见解释所提出的各种方法之间的差异的答案)。当然,它还会生成更多的数据库调用,因为它会写入两个表。

© www.soinside.com 2019 - 2024. All rights reserved.