Django ModelForm使用不同的ForeignKeys创建多个实例

时间:2015-11-13 15:53:58

标签: django django-models django-forms

在我的Django应用程序中,我有两个这样的模型:

class Foo(models.Model):
    name = models.CharField(max_length=10)
    bar = models.ForeignKey(Bar)

class Bar(models.Model):
    class descr = models.CharField(max_length=50)

我希望有一个Foo的ModelForm,这很容易。但是,我希望能够创建多个Foo实例,这些实例分别绑定到不同的Bar实例。所以,假设我有三个Bar个实例,我希望有一个模型表单,只有一个表单和一个提交,将创建三个Foo个实例,每个实例分别链接新的Foo个实例。实例到我的Bar个实例之一。

基本上我正在做的是做一个"批量创作" Foo。我不想使用多对多,因为我不希望一个Foo对象绑定到三个Bar对象。我希望每个酒吧都有自己独特的Foo。

我想我可以使用ModelForm,当我实例化它时,可能会添加一些对我的Bar实例的引用,然后覆盖模型上的save()以创建"复制"条目。我的模型形式不包括bar字段,因为我手动处理它。

这看起来是正确的做法吗?任何陷阱?其他设计方法?

1 个答案:

答案 0 :(得分:0)

它并不像你想象的那么复杂。在django中,当您将对象的id设置为null并再次保存时,django将创建一个与第一个实例相同的新实例。所以你可以粗略地做:

form = FooForm(request.POST or None)
if form.is_valid():
    new_foo = form.save()
    new_foo.id = None
    # this will create another instance
    new_foo.save()

The doc has a section describes this

你的方法有一个陷阱,你应该尽可能地避免重写模型/模型形式save()方法,它会搞砸很多东西和/或使事情复杂化。如果您想在模型上保存其他步骤,请使用django pre_savepost_save signals。如果您想对模型表单执行某些操作,请执行obj = form.save(commit=False)并根据需要更改obj,然后执行obj.save()