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

如何在Django项目中实现供多应用继承的顶层公共模型?

Django 顶层公共模型实现方案

错误原因

直接在项目根目录创建models.py会触发错误,因为根目录不属于INSTALLED_APPS中注册的任何应用,Django无法识别模型的所属应用标签(app_label)。

正确实现方案

方案1:创建独立公共应用(推荐)

  • 在项目根目录下生成名为common的公共应用:
    python manage.py startapp common
    
  • 将common添加到项目settings.py的INSTALLED_APPS列表:
    INSTALLED_APPS = [
        # 已有的业务应用(如food、nursing)
        'common',
    ]
    
  • 在common/models.py中定义带通用字段的抽象基类模型:
    from django.db import models
    
    class BaseModel(models.Model):
        created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
        updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
        is_active = models.BooleanField(default=True, verbose_name='是否启用')
    
        class Meta:
            abstract = True  # 标记为抽象类,不会生成独立数据库表
    
  • 各业务应用的模型直接继承该抽象基类:
    # food/models.py 示例
    from django.db import models
    from common.models import BaseModel
    
    class Food(BaseModel):
        name = models.CharField(max_length=100, verbose_name='菜品名称')
        price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格')
        # 其他业务专属字段
    

方案2:根目录定义抽象基类(不推荐)

如果不想新增应用,可在项目根目录的models.py中仅定义抽象基类:

from django.db import models

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

各业务应用模型继承该类即可——抽象基类不会被Django视为需要注册的实体模型,因此不会触发app_label错误。

注意:如果根目录models.py中存在非抽象模型,必须为其指定app_label(如app_label = 'food'),但这种方式会导致模型归属混乱,不适合生产环境。

核心注意事项

  • 公共模型必须设置abstract = True,否则Django会尝试为其创建数据库表,进而因无所属应用报错。
  • 优先选择独立公共应用的方案,符合Django的应用架构规范,便于后续维护和功能扩展。

内容的提问来源于stack exchange,提问作者parmer_110

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:22:30