您好,
我已将ModelForm绑定到我的一个模型中,该模型包含一个ForeignKey到另一个模型,由CreateView驱动。我想要实现的是创建与外键对应的模型对象(如果在整体验证表单之前它不存在,并且在数据库中创建最终对象。
在我使用的模型下面:
class UmsAlerting(models.Model):
alert_id = models.IntegerField(primary_key=True, editable=False)
appli = models.ForeignKey('UmsApplication')
env = models.ForeignKey('UmsEnvironment')
contact = models.ForeignKey('UmsContacts')
custom_rule = models.ForeignKey('UmsCustomRules', null=True, blank=True)
class UmsApplication(models.Model):
appli_id = models.IntegerField(primary_key=True)
trigram_ums = models.CharField(max_length=4L)
class UmsContacts(models.Model):
contact_id = models.IntegerField(primary_key=True)
mail_addr = models.CharField(max_length=100L)
class UmsEnvironment(models.Model):
env_id = models.IntegerField(primary_key=True)
env_name = models.CharField(max_length=5L)
绑定到表单的模型是UmsAlerting
。如果不存在,我想要创建的模型对象是UmsContacts
。我设法在联系人字段的clean
中使用字段的ModelForm
方法,并使用如下所示的get_or_create方法:
def clean_contact(self):
data = self.cleaned_data['contact']
c, _ = UmsContacts.objects.get_or_create(mail_addr=data)
return c
当联系人已经在数据库中时,它完全有效但当需要创建它时,我的表单在联系人字段上返回ValidationError
,说“此字段不能为空”。如果我第二次提交相同的表单而不更改任何内容,则UmsAlerting
对象创建良好且没有验证错误。
我的猜测是,由于我没有得到的原因,当get_or_create
用于创建UmsContacts
对象时,它不能用于创建新的UmsAlerting
对象。因此,在clean_contact
方法中,get工作并返回UmsContacts
对象,但创建部分不返回。这就像在验证整个表单时保存UmsContacts
对象,但不是之前我想要它。
任何人都可以帮我找出问题所在?使用干净的方法不是最好的主意吗?是否有其他策略可用于解决此问题?
提前感谢您的帮助。
答案 0 :(得分:1)
这可能是因为您正在创建的对象需要contact_id的值。如果您使用contact_id字段来设置对象ID,那么您根本不必创建它。 Django会自动处理Id。
另外。字段清理方法应该返回清理数据而不是对象。这会自己造成更多问题。