Django автоматически наследует "abstract = true" от абстрактного мета-класса - PullRequest
1 голос
/ 29 июня 2011

Я использую следующий код.

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, то это работает.

Почемуон наследует true, если их документация говорит, что он должен наследовать false?

Django выполняет одну настройку для класса Meta абстрактного базового класса: перед установкой Metaатрибут, он устанавливает abstract=False.Это означает, что потомки абстрактных базовых классов сами не становятся автоматически абстрактными классами.

1 Ответ

8 голосов
/ 29 июня 2011

Ваш 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)
...