【问题标题】:How do I easily create a calculated field in a Django model?如何在 Django 模型中轻松创建计算字段?
【发布时间】:2016-06-28 20:57:55
【问题描述】:

No, I don't want a propertyI really don't。我要的就是我问的。


由于子类化要求,我正在寻找一种方法来从一组其他两个字段中生成一个字段并将此计算存储在数据库中。不是 Python 中的属性,不是 SQL 计算,是在保存时更新并按原样存储在数据库中的预计算字段。

例如:

class Help(models.Model):
    title = models.TextField()
    body = models.TextField()

class SoftwareHelp(Help):
    about_software = models.ForeignKey('Software')

无论用户在title 字段中输入什么内容,我都希望它在单击保存后显示“帮助”。实际上,代码有更多的字段,但这说明了原理。

我知道可以通过覆盖 save() 方法来做到这一点,但想确保我没有两次保存到数据库中,并想知道是否有其他更好的方法。

【问题讨论】:

  • 你最后一句话是什么意思?为什么会覆盖save方法两次保存到数据库?
  • 我看到的一个答案有一个 save 方法,由于某种原因两次调用 super.save
  • 你还记得这个链接吗?
  • 它是序言中的两个之一-您可能看不到已删除的答案-stackoverflow.com/a/17682852/764357
  • 第一个save 调用是不必要的。也许这就是帖子被删除的原因之一:)

标签: python django django-models


【解决方案1】:

我认为最简单的方法是覆盖save 方法。我看不出它应该保存到数据库两次的任何理由。

class SoftwareHelp(Help):
    about_software = models.ForeignKey('Software')

    def save(self, *args, **kwargs):
        self.about_software = 'Help for %s' % self.title
        return super(SoftwareHelp, self).save(*args, **kwargs)

【讨论】:

  • 这几乎是我必须做的。
  • 似乎pre_save 是一个更好的候选人。但是,如果我希望在创建该模型的实例后立即设置 about_software,我该怎么做?编辑:嗯,没关系,pre_save 用于Field,而不是Model
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 2020-08-06
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
相关资源
最近更新 更多