Django:从抽象基础 class 模型覆盖模型方法

Django: Override model methods from abstract base class models

我正在尝试在 Django 中使用抽象基础 class 模型,以避免编写一些重复代码并遇到一些意外行为。

这是我的抽象基础的简化版本class:

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 否则代码会产生错误。我想在 subclasses 中为 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 returned NoneType。我尝试将 AbstractDocument return 中的方法设为实际路径,但在该场景中子方法也不会覆盖父方法。

有什么原因导致我尝试做的事情无法实现吗?我在实施中遗漏了什么吗?是否有其他或更好的方法来完成此操作?

在此先感谢您的帮助!

Field is a class attribute,不是实例,但您正试图 link 它到实例的方法,这实际上不是 possible/correct。

所以尝试将您的方法标记为 @staticmethod 或切换到类似于 second answer here 中提出的解决方案:创建一个 "simple" 函数调用实例(这是upload_to) 方法,可以被继承和覆盖。