1

你好,

我已经将一个 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验证整个表单时保存了对象,但不是在我想要的之前。

任何人都可以帮我找出问题所在?使用干净的方法不是最好的主意吗?是否有另一种策略可以用来解决这个问题?

在此先感谢您的帮助。

4

1 回答 1

1

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

还。字段清理方法应该返回清理后的数据而不是对象。这本身就会产生更多问题。

于 2013-11-13T18:02:14.153 回答