【问题标题】:Django automatically inheriting "abstract = true" from an abstract meta classDjango 自动从抽象元类继承“abstract = true”
【发布时间】:2011-06-29 09:45:32
【问题描述】:

我正在使用以下代码。

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 说它应该继承false,为什么它要继承true

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

【问题讨论】:

  • 好的,感谢您今天与我们分享,bidu。你有什么问题?
  • :) ,我的问题是他们的文档说默认情况下它将继承 False 不是 true
  • @bidi - 也许您应该将其作为 Django 错误报告发布?
  • @Bo 我对 Django 很陌生,我不认为我可以在 django 中找到错误,所以我想我一定是在某个地方错了

标签: django inheritance abstract-class


【解决方案1】:

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

【讨论】:

  • 哇,非常感谢,我在等你这样的人回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多