我正在尝试在 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 中的方法返回一个实际路径,但在那种情况下,子方法也不会覆盖父方法。
有什么原因我想做的事情是不可能的吗?我在实施中缺少什么吗?是否有另一种或更好的方法来实现这一点?
在此先感谢您的帮助!