こんにちは、
CreateView によって駆動される別のモデルへの ForeignKey を含むモデルの 1 つに ModelForm をバインドしました。私が達成したいのは、フォームが全体的に検証され、最終的なオブジェクトがデータベースに作成される前に存在しない場合、外部キーに対応するモデル オブジェクトを作成することです。
私が使用するモデルの下:
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
、連絡先フィールドに「このフィールドを null にすることはできません」という a を返します。何も変更せずに同じフォームをもう一度送信すると、UmsAlerting
オブジェクトは検証エラーなしで適切に作成されます。
私の推測では、オブジェクトの作成に を使用すると、新しいオブジェクトの作成には使用できないget_or_create
という理由がわかりません。したがって、メソッドでは get が機能してオブジェクトを返しますが、作成部分は機能しません。フォーム全体が検証されたときにオブジェクトが保存されるようですが、私が望むようになる前ではありません。UmsContacts
UmsAlerting
clean_contact
UmsContacts
UmsContacts
誰でも私が問題を見つけるのを手伝ってくれますか? クリーンな方法を使用するのは最善のアイデアではありませんか? この問題を回避するために使用する別の戦略はありますか?
よろしくお願いします。