Django get_或\u create在ModelForm的clean方法中不返回可用的模型对象

2024-10-04 03:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

你好

我已经将一个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。我设法在联系人字段的ModelForm中使用了字段的clean方法,并使用了如下所示的get_或_create方法:

^{pr2}$

当联系人已经在数据库中,但当需要创建它时,我的表单在联系人字段上返回一个ValidationError,表示“此字段不能为空”。如果我第二次提交相同的表单而不做任何更改,UmsAlerting对象创建得很好,没有验证错误。在

我的猜测是,由于我不明白的原因,当get_or_create用于创建UmsContacts对象时,它不能用于创建新的UmsAlerting对象。因此,在clean_contact方法中,get正在工作并返回UmsContacts对象,但create部分没有。这就像是在验证整个表单时保存UmsContacts对象,而不是我希望的那样。在

谁能帮我找出问题出在哪里?使用干净的方法不是最好的主意吗?有没有其他策略可以用来解决这个问题?在

提前谢谢你的帮助。在


Tags: 对象方法key模型idtrue表单model
1条回答
网友
1楼 · 发布于 2024-10-04 03:17:21

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

还有。字段清理方法应返回已清理的数据而不是对象。这本身就造成了更多的问题。在

相关问题 更多 >