在验证之前,我需要基于对象模型中的其他字段在Django模型中设置一些字段。它们是可以手动输入的字段,但是如果没有输入,则应该从其他字段生成它们,如果是,则可能需要进一步修改。一旦设置好,它们就可以分开进化。
对于我想要达到的目标,一个好的代理或简单的示例可能是拥有first_name
,last_name
和full_name
。如果创建时未提供full_name
或更新时未提供first_name
,我想从last_name
和class 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}}的正确方法是什么?
答案 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:])