【问题标题】:Django child models don't inherit Meta inner classDjango 子模型不继承 Meta 内部类
【发布时间】:2026-01-16 19:30:01
【问题描述】:

我有两个 Django 3.0 模型,其中一个是另一个的子类:

# models.py
class BaseCategory(models.Model):

    class Meta:
        verbose_name_plural = "categories"

class Category(BaseCategory):

    # fields 'n' stuff

只有 Category 模型在 Admin 中注册

# admin.py
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):

    # stuff here

在 Admin 中,Category 模型被标记为“类别”,尽管它应该从 BaseCategory 继承 Meta 内部类及其 verbose_name_plural 属性。实际上,如果我将相同的代码复制到Category 模型中,

# models.py
class Category(BaseCategory):

    class Meta:
        verbose_name_plural = "categories"

    # fields 'n' stuff

模型在管理员中正确标记为“类别”。这表明Category类没有继承BaseCategoryMeta内部类。

为什么子类不继承Meta 内部类?是否有另一种方法让我只指定一次verbose_name_plural,而不是将完全相同的代码复制到BaseCategory 的每个孩子中?

【问题讨论】:

    标签: django inheritance django-models


    【解决方案1】:

    根据Django Docs,您需要声明BaseCategory模型抽象,以便继承其Meta类。

    class BaseCategory(models.Model):
    
        class Meta:
            abstract = True
            verbose_name_plural = "categories"
    

    Category 类将自动继承 Meta 类,abstract 属性除外。

    请注意,如果您想对Category 中的Meta 类进行任何更改,您需要明确地对其进行子类化:

    class Category(BaseCategory):
    
        class Meta(BaseCategory.Meta):
            ...
    

    【讨论】:

    • 文档在哪里说 Meta 不是为非抽象类继承的?我找不到它。您链接到的部分说Meta 可用作抽象类的子类的属性,但这与我正在做的事情无关。
    • 我将文档解释为 Meta 不会被自动继承,除非类是抽象的。我想您可以显式继承 class Meta(BaseCategory.Meta) 而无需使类抽象。我从来没有这样尝试过。如果您将BaseCategory 抽象化,您的代码是否有效?
    • 默认的 Python 继承规则将使 Meta 被继承,所以如果 Django 打破了这一点,我希望能清楚地说明这一事实,而与抽象类相关的任何事情都无关。如果我可以相信他们能够胜任地记录他们的代码,至少。我无法将BaseCategory 抽象化。