0

我正在尝试在 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 中的方法返回一个实际路径,但在那种情况下,子方法也不会覆盖父方法。

有什么原因我想做的事情是不可能的吗?我在实施中缺少什么吗?是否有另一种或更好的方法来实现这一点?

在此先感谢您的帮助!

4

1 回答 1

1

Field 是类属性,而不是实例,但您试图将其链接到实例的方法,这实际上是不可能/正确的。

因此,请尝试将您的方法标记为@staticmethod或切换到类似于此处第二个答案中提出的解决方案:创建一个“简单”函数调用实例的(这是 中的第一个参数upload_to)方法,该方法可以被继承和覆盖。

于 2020-02-01T15:57:00.623 回答