【问题标题】:Django link to existing item or create if unique in multi-model formDjango链接到现有项目或在多模型形式中创建唯一
【发布时间】:2012-08-02 16:29:24
【问题描述】:

我有一个使用多个模型的表单,这些模型具有关系。如果其中一种形式的数据与现有条目匹配,我希望将外键映射到现有条目,而不是创建重复条目。但是,is_valid() 对于已经存在的条目会失败,我不确定在清理表单数据之前使用表单数据是否安全,以便首先查找存在的数据库。也许我需要更改 clean 函数以忽略唯一性要求,然后在视图中处理它?

这是一个示例,用户在 Web 表单中输入他们的姓名、城市和州。如果数据库已经知道那个城市,那么这个人的外键应该只指向现有的条目。如果是新城市,则应将其添加到数据库中。所以它始终是针对 Person 的 CREATE,但它可能是也可能不是针对 Hometown 的 CREATE。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2014-12-22
      相关资源
      最近更新 更多