你好
我已经将一个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方法:
当联系人已经在数据库中,但当需要创建它时,我的表单在联系人字段上返回一个ValidationError
,表示“此字段不能为空”。如果我第二次提交相同的表单而不做任何更改,UmsAlerting
对象创建得很好,没有验证错误。在
我的猜测是,由于我不明白的原因,当get_or_create
用于创建UmsContacts
对象时,它不能用于创建新的UmsAlerting
对象。因此,在clean_contact
方法中,get正在工作并返回UmsContacts
对象,但create部分没有。这就像是在验证整个表单时保存UmsContacts
对象,而不是我希望的那样。在
谁能帮我找出问题出在哪里?使用干净的方法不是最好的主意吗?有没有其他策略可以用来解决这个问题?在
提前谢谢你的帮助。在
这可能是因为您正在创建的对象需要contact_id的值。如果您使用contact_id字段来设置对象id,那么您根本不必创建它。Django自动处理Id。在
还有。字段清理方法应返回已清理的数据而不是对象。这本身就造成了更多的问题。在
相关问题 更多 >
编程相关推荐