Django get_or_create不会在ModelForm的clean方法中返回可用的Model对象

时间:2013-11-13 17:58:37

标签: python django forms

您好,

我已将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对象,但不是之前我想要它。

任何人都可以帮我找出问题所在?使用干净的方法不是最好的主意吗?是否有其他策略可用于解决此问题?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这可能是因为您正在创建的对象需要contact_id的值。如果您使用contact_id字段来设置对象ID,那么您根本不必创建它。 Django会自动处理Id。

另外。字段清理方法应该返回清理数据而不是对象。这会自己造成更多问题。