我有一个使用多个模型的表单,这些模型具有关系。如果其中一种形式的数据与现有条目匹配,我希望将外键映射到现有条目,而不是创建重复条目。但是,is_valid() 对于已经存在的条目会失败,我不确定在清理表单数据之前使用表单数据是否安全,以便首先查找存在的数据库。也许我需要更改 clean 函数以忽略唯一性要求,然后在视图中处理它?
下面是一个示例,用户在 Web 表单中输入他们的姓名、城市和州。如果数据库已经知道那个城市,那么这个人的外键应该只指向现有的条目。如果是新城市,则应将其添加到数据库中。因此,它始终是针对 Person 的 CREATE,但它可能是也可能不是针对 Hometown 的 CREATE。
模型.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")
表格.py
class PersonForm(ModelForm):
class Meta:
model = Person
exclude = ('hometown')
class HometownForm(ModelForm):
class Meta:
model = Hometown
视图.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 在视图中强制执行它)还是表明我的设计从根本上是解决此问题的错误方法?