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

时间:2011-06-29 09:45:33

标签: 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

班级

class Book(models.Model, CommonFunctions):
        book_name = models.CharField(max_length=30)
        book_area = models.CharField(max_length=30)

现在,如果我使用它,我会收到错误,

  

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

但如果我使用

 class Meta:
      abstract = False

Book课程中,它可以正常工作。

如果documentation表示它应该继承true,为什么会继承false

  

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

1 个答案:

答案 0 :(得分: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

然后,您的Book课程应仅基于CommonFunctions

class Book(CommonFunctions):
    book_name = models.CharField(max_length=30)
    book_area = models.CharField(max_length=30)