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

标签 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 cannot define a relation with abstract class

但是如果我用

 class Meta:
      abstract = False

然后在 Book 类中它就可以工作了。

如果它们的 documentation 为什么要继承 true说它应该继承false

Django does make one adjustment to the Meta class of an abstract base class: before installing the Meta attribute, it sets abstract=False. This means that children of abstract base classes don't automatically become abstract classes themselves.

最佳答案

您的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)

关于Django 自动从抽象元类继承 "abstract = true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518655/

相关文章:

java - java中使用抽象类的方法重载的困惑

c++ - 序列化多态指针的QVector

python - prod 服务器上的 cron 作业 django - 找不到管理.py

python - Django Rest Framework Serializer中,如何获取图片的完整路径?

python - 创建 super 用户django时出错

VB.NET 强制继承多代

python - 如何使用基于类的 View 更改传递给模板的表单的键

c++ - 分配抽象类类型 'CObject' 的对象

java - 当实现仅在一个方法上不同时,建议使用哪种设计模式?

python - Django REST Framework 序列化 ForeignKey 和 ManyToManyFields