1

こんにちは、

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 が機能してオブジェクトを返しますが、作成部分は機能しません。フォーム全体が検証されたときにオブジェクトが保存されるようですが、私が望むようになる前ではありません。UmsContactsUmsAlertingclean_contactUmsContactsUmsContacts

誰でも私が問題を見つけるのを手伝ってくれますか? クリーンな方法を使用するのは最善のアイデアではありませんか? この問題を回避するために使用する別の戦略はありますか?

よろしくお願いします。

4

1 に答える 1

1

おそらく、作成しているオブジェクトが contact_id の値を期待しているためです。オブジェクト ID を設定するためだけに contact_id フィールドを使用する場合は、まったく作成する必要はありません。Django は ID を自動的に処理します。

また。フィールドの clean メソッドは、オブジェクトではなくクリーンなデータを返す必要があります。それはそれ自体でさらに多くの問題を引き起こします。

于 2013-11-13T18:02:14.153 に答える