你好,
我已经将一个 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
对象,但 create 部分没有。就像在UmsContacts
验证整个表单时保存了对象,但不是在我想要的之前。
任何人都可以帮我找出问题所在?使用干净的方法不是最好的主意吗?是否有另一种策略可以用来解决这个问题?
在此先感谢您的帮助。