验证之前,如何在Django中的模型中设置字段?

时间:2018-10-13 14:18:28

标签: django

在验证之前,我需要基于对象模型中的其他字段在Django模型中设置一些字段。它们是可以手动输入的字段,但是如果没有输入,则应该从其他字段生成它们,如果是,则可能需要进一步修改。一旦设置好,它们就可以分开进化。

对于我想要达到的目标,一个好的代理或简单的示例可能是拥有first_namelast_namefull_name。如果创建时未提供full_name或更新时未提供first_name,我想从last_nameclass Person(models.Model): first_name = models.CharField(null=False, blank=False, max_length=100) last_name = models.CharField(null=False, blank=False, max_length=100) full_name = models.CharField(null=False, blank=False, max_length=200) def clean_fields(self, exclude=None): if not self.full_name and self.first_name and self.last_name: self.full_name = self.first_name + " " + self.last_name return super(Person, self).clean_fields(exclude) 重新计算

我试图做这样的事情:

full_name

当我尝试将对象保存在管理工具中时,成功设置了full_name(我可以在调试器中看到它),但是我仍然收到full_name为空白验证错误,并且当再次生成表单,生成的字段保持空白。

在这种情况下,填充{{1}}的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

也许可以替代clean_fields来代替在save上执行此操作?几乎完全可以使用clean_fields中的代码-

    def save(self, *args, **kwargs):
        if not self.full_name and self.first_name and self.last_name:
            self.full_name = self.first_name + " " + self.last_name
        super().save(*args, **kwargs)

但是,我建议不要将full_name用作其自己的字段-它是您数据库中的重复数据,现在您必须担心全名以及名字和名字不同步。如果全名不为空,但他们先更改还是最后更改,会发生什么?您是否还不想更改全名?

相反,为什么不使用属性?

@property
def full_name(self):
    return self.first_name + " " + self.last_name

设置器是可选的-我个人不包括设置器,并且强制更新仅在名字和姓氏字段中发生,因为难以处理“ Victor von Doom”之类的名称-但您可以通过像

@setter.full_name
def full_name(self, new_val):
    names = new_val.split()
    self.first_name = names[0]
    self.last_name = " ".join(names[1:])