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
) 方法,可以被继承和覆盖。
我正在尝试在 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
) 方法,可以被继承和覆盖。