Django: переопределить методы модели из абстрактных моделей базового класса - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь использовать абстрактную модель базового класса в Django, чтобы избежать написания дубликата кода и непредвиденного поведения.

Вот упрощенная версия моего абстрактного базового класса:

class AbstractDocument(models.Model):
  notes = models.CharField(max_length=255)
  document = models.FileField(upload_to=document_file_path)

  def document_file_path(instance, filename):
    pass

  class Meta:
    abstract = True    

Мне нужно определить метод document_file_path, иначе код выдаст ошибку. Я хочу определить другое поведение в подклассах для document_file_path. Ниже приведен пример:

class BookDocument(AbstractDocument):
  book = models.ForeignKey(Book, on_delete=models.CASCADE)

  def document_file_path(instance, filename):
    return f'books/{filename}'

Не похоже, что дочерний метод переопределяет родительский метод, потому что я получаю сообщение об ошибке, что document_file_path возвратил NoneType, когда я запускаю приведенный выше код. Я пытался заставить метод в AbstractDocument возвращать фактический путь, но дочерний метод также не переопределяет родителя в этом сценарии.

Есть ли какая-то причина, почему то, что я пытаюсь сделать, невозможно? Что-то мне не хватает в реализации? Есть ли другой или лучший способ сделать это sh? 1011

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 01 февраля 2020

Поле является атрибутом класса , а не экземпляром, но вы пытаетесь связать его с методом экземпляра, который на самом деле не возможен / не корректен.

Поэтому попробуйте пометить ваш метод как @staticmethod или переключиться на решение, подобное предложенному во втором ответе здесь : создайте «простую» функцию, вызывающую экземпляр (который является первым аргументом в upload_to) метод, который может быть унаследован и переопределен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...