【发布时间】:2020-02-01 14:47:46
【问题描述】:
我正在尝试在 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 中的方法返回一个实际路径,但在那种情况下子方法也不会覆盖父方法。
我尝试做的事情不可能有什么原因吗?我在实施中缺少什么吗?是否有其他或更好的方法来实现这一点?
提前感谢您的帮助!
【问题讨论】:
-
这里的错字:
abtract = True,如果它在你的代码中,你会想要修复它。 -
谢谢。这只是我的示例代码中的一个错字(现已更正)。
标签: django django-models abstract-base-class