Django链接到现有项目或创建多模型形式的唯一

时间:2012-08-02 16:29:24

标签: python django django-models django-forms django-views

我有一个使用多个模型的表单,它们有关系。如果其中一个表单的数据与现有条目匹配,我希望将外键映射到现有条目,而不是创建重复条目。但是,对于现有的条目,is_valid()失败,我不确定在清除表单数据之前是否可以安全地首先进行数据库查找。也许我需要更改clean函数以忽略唯一性要求,然后在视图中处理它?<​​/ p>

以下是一个示例,用户在网络表单中输入他们的姓名,城市和州。如果数据库已知该城市,则该人的外键应仅指向现有条目。如果是新城市,则应将其添加到数据库中。所以它始终是人的创造,但它可能是也可能不是故乡的创造。

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在视图中强制执行它),还是表明我的设计从根本上解决了这个问题的错误方法?

1 个答案:

答案 0 :(得分:0)

stackoverflow上的类似问题包含了我需要的信息。 Free-form input for ForeignKey Field on a Django ModelForm

应用于我原来的问题,我删除了HometownForm,而是将相关字段添加到PersonForm,然后使PersonForm的save()函数处理Hometown的get_or_create()行为。