Django子类数据表未包含父类字段问题求助
问题分析与解决
你现在的问题核心出在模型继承的类型设置上:
当前代码的问题
你的
Parent是普通模型,未设置abstract=True,Django默认使用多表继承:Parent会单独生成名为InserstionOrders的表,包含所有父类字段Child1和Child2的表只会有自身的dsp字段,再加一个指向Parent表的外键关联,所以你在pgadmin里看不到父类字段——它们并不在子表中,而是存储在父表,子表通过外键关联调用。
你尝试添加
abstract=True时出错,是因为抽象基类的Meta不需要设置db_table:抽象类不会生成自己的数据库表,这个多余的db_table配置会触发Django报错。
正确写法(抽象基类继承)
要让父类字段直接嵌入子表,需把Parent定义为抽象基类,修改代码如下:
class Parent(models.Model): advertiser = models.CharField('Advertiser', max_length=100) insertion_order = models.ForeignKey(UserInsertionOrder, on_delete=models.CASCADE) strategy = models.CharField('Strategy Name', max_length=300) creative = models.CharField('Creative Name', max_length=400) def __str__(self): return "%s" % self.insertion_order class Meta: abstract = True # 开启抽象类标记 # 移除db_table配置,抽象类不生成独立表 class Child1(Parent): dsp = models.CharField('DV360', max_length=25) class Child2(Parent): dsp = models.CharField('Xandr', max_length=25)
关键说明
- 开启
abstract=True后,Parent仅作为字段和方法的模板,不会生成自己的数据库表 - 执行
makemigrations和migrate后,Child1和Child2的表会包含父类所有字段(advertiser、insertion_order、strategy、creative)加上自身的dsp字段 - 若需给子类指定自定义表名,可在各自的
Meta中单独设置,例如:class Child1(Parent): dsp = models.CharField('DV360', max_length=25) class Meta: db_table = 'child1_dv360'
内容的提问来源于stack exchange,提问作者aba2s
相关产品推荐
相关产品推荐

