0

関係のある複数のモデルを使用するフォームがあります。いずれかのフォームのデータが既存のエントリと一致する場合、重複エントリを作成するのではなく、外部キーを既存のエントリにマップさせたいと思います。ただし、is_valid()は既存のエントリに対して失敗し、データベースのルックアップを最初に実行するためにクリーンアップされる前にフォームデータを使用しても安全かどうかはわかりません。おそらく、一意性の要件を無視してビューで処理するようにクリーン関数を変更する必要がありますか?

次に例を示します。ユーザーは、名前、都市、州をWebフォームに入力します。その都市がデータベースにすでに知られている場合、その人の外部キーは既存のエントリを指しているだけです。新しい都市の場合は、データベースに追加する必要があります。したがって、これは常にCREATE for Personですが、CREATEforHometownである場合とそうでない場合があります。

models.py

class Person(models.Model):
    name = models.CharField()
    hometown = models.ForeignKey('Hometown')

class Hometown(models.Model):
    cityName = models.CharField()
    stateName = models.CharField()
    mascot = models.CharField()

    #If same city and state, it's the same place
    class Meta:
        unique_together = ("cityName", "stateName")

forms.py

class PersonForm(ModelForm):
    class Meta:
        model = Person
        exclude = ('hometown')

class HometownForm(ModelForm):
    class Meta:
        model = Hometown 

views.py

def newPerson(request):
    if request.method == 'POST':
        person = PersonForm(request.POST)
        hometown = HometownForm(request.POST)
        if (person.is_valid() and hometown.is_valid():
            p = person.save(commit=False)
            h = Hometown.objects.get_or_create(**hometown.cleaned_data)
            p.hometown = h
            p.save()

その都市/州のペアがすでにデータベースにある場合、hometown.is_valid()はFalseになるため、このコードは機能しません。clean()関数をオーバーライドして、一意性の要件を無視できるようにする必要がありますか(get_or_createを使用してビューで強制する)、または私の設計がこの問題に対処するための根本的に間違った方法であることを示していますか?

4

1 に答える 1

0

stackoverflow に関する同様の質問には、必要な情報が含まれていました。 Django ModelForm の ForeignKey フィールドの自由形式入力

元の質問に適用されるように、HometownForm を削除し、代わりに関連フィールドを PersonForm に追加してから、PersonForm の save() 関数が Hometown の get_or_create() 動作を処理するようにしました。

于 2012-08-02T18:44:05.193 に答える