0

我有一个使用多个模型的表单,这些模型具有关系。如果其中一种形式的数据与现有条目匹配,我希望将外键映射到现有条目,而不是创建重复条目。但是,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 在视图中强制执行它)还是表明我的设计从根本上是解决此问题的错误方法?

4

1 回答 1

0

stackoverflow 上的一个类似问题包含我需要的信息。 Django ModelForm 上 ForeignKey 字段的自由格式输入

正如我最初的问题一样,我删除了 HometownForm,而是将相关字段添加到 PersonForm,然后让 PersonForm 的 save() 函数处理 Hometown 的 get_or_create() 行为。

于 2012-08-02T18:44:05.193 回答