首页 > 解决方案 > Django 子模型不继承 Meta 内部类

问题描述

我有两个 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模型被标记为“Categorys”,尽管它应该继承了Meta内部类及其verbose_name_plural属性BaseCategory。事实上,如果我将相同的代码复制到Category模型中,

# models.py
class Category(BaseCategory):

    class Meta:
        verbose_name_plural = "categories"

    # fields 'n' stuff

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

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

标签: djangoinheritancedjango-models

解决方案


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

class BaseCategory(models.Model):

    class Meta:
        abstract = True
        verbose_name_plural = "categories"

然后Category该类将自动继承Meta该类,但abstract属性除外。

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

class Category(BaseCategory):

    class Meta(BaseCategory.Meta):
        ...

推荐阅读