Django自动从抽象元类继承"abstract = true"

Ran*_*ngh 1 django inheritance abstract-class

我使用以下代码.

class CommonFunctions(object):

    def get_absolute_url(self):
        return "/{0}/list/".format(self.__class__.__name__).lower()

    def get_fields(self):
        return [(field, field.value_to_string(self)) for field in   (self.__class__)._meta.fields]

    class Meta:
          abstract = True
Run Code Online (Sandbox Code Playgroud)

这堂课是

class Book(models.Model, CommonFunctions):
        book_name = models.CharField(max_length=30)
        book_area = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用它,我得到一个错误,

ForeignKey 无法定义与抽象类的关系

但是,如果我使用

 class Meta:
      abstract = False
Run Code Online (Sandbox Code Playgroud)

Book课堂上然后它工作.

true如果他们的文档说它应该继承,为什么它继承false

Django确实对抽象基类的Meta类进行了一次调整:在安装Meta属性之前,它设置了abstract=False.这意味着抽象基类的子项本身不会自动成为抽象类.

Eti*_*nne 8

CommonFunctions应该基于models.Model,而不是object.这样,您将获得Django文档中声明的行为.

class CommonFunctions(models.Model):

    def get_absolute_url(self):
        return "/{0}/list/".format(self.__class__.__name__).lower()

    def get_fields(self):
        return [(field, field.value_to_string(self)) for field in   (self.__class__)._meta.fields]

    class Meta:
          abstract = True
Run Code Online (Sandbox Code Playgroud)

然后你的Book课程应该只基于CommonFunctions.

class Book(CommonFunctions):
    book_name = models.CharField(max_length=30)
    book_area = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)