You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django子类数据表未包含父类字段问题求助

问题分析与解决

你现在的问题核心出在模型继承的类型设置上:

当前代码的问题

  1. 你的Parent是普通模型,未设置abstract=True,Django默认使用多表继承:

    • Parent会单独生成名为InserstionOrders的表,包含所有父类字段
    • Child1和Child2的表只会有自身的dsp字段,再加一个指向Parent表的外键关联,所以你在pgadmin里看不到父类字段——它们并不在子表中,而是存储在父表,子表通过外键关联调用。
  2. 你尝试添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:53:30