関係のある複数のモデルを使用するフォームがあります。いずれかのフォームのデータが既存のエントリと一致する場合、重複エントリを作成するのではなく、外部キーを既存のエントリにマップさせたいと思います。ただし、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を使用してビューで強制する)、または私の設計がこの問題に対処するための根本的に間違った方法であることを示していますか?