【问题标题】:Django: Override model methods from abstract base class modelsDjango:从抽象基类模型中覆盖模型方法
【发布时间】: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


【解决方案1】:

Field is a class attribute,不是实例,但您试图将其链接到实例的方法,这实际上是不可能/不正确的。

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

【讨论】:

  • 谢谢。我最终咨询了上面链接的答案以寻求解决方案。
猜你喜欢
  • 2016-05-13
  • 2012-11-06
  • 1970-01-01
  • 2018-08-21
  • 2020-06-14
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2018-03-07
相关资源
最近更新 更多