【问题标题】:Model attribute based on another attribute基于另一个属性的模型属性
【发布时间】:2016-07-21 01:33:09
【问题描述】:

是否可以让一个模型属性依赖于另一个属性?在我的例子中,模型Job 中有一个has_translator 属性。当且仅当translator 不是Null 时,我希望此属性为True

我正在考虑覆盖Job 类的save 方法或创建一个新的方法属性has_translator,这可能不是最好的方法。

an answer 谈论覆盖save 方法,但我不确定为什么在这种情况下调用super,所以我不确定是否应该使用它。

class Job(models.Model):
    customer = models.ForeignKey(User, related_name='customer')
    translator = models.ForeignKey(User, related_name='freelancer',null=True)

    description = models.TextField()
    language_tuple = models.ForeignKey(LanguageTuple,related_name='language_tuple')
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    is_active = models.BooleanField(default=False)
    has_translator = # If translator is not None/Null, then True else False

【问题讨论】:

  • 你真的需要一个存储在数据库中的字段吗?为什么不只是模型上的一个属性?
  • super 方法被调用以完成其余的工作。请注意链接上的self.subject_init = self.subject_initials() 应该修改self obj。修改后的 self 被传递给 super 方法。

标签: python django models


【解决方案1】:

您可以将其添加为属性,将其添加为字段没有任何意义,因为如果您在查询集中需要它,您可以根据翻译器进行过滤,以及其他任何不需要的东西涉及数据库,使用属性即可

@property
def has_translator(self):
    return self.translator_id is not None

【讨论】:

  • 小题大做,这里最好使用self.translator_id,这样在有值的时候就不会触发不必要的db查询。
  • 这似乎可行,但我不确定是否可以在模板中将此属性称为属性。 job.has_translator...
  • @Milano - 当然可以,和你写的差不多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多