2015-11-13 82 views
0

在我的Django应用程序,我有两个模型,如这些:的Django的ModelForm创建多个实例具有不同的ForeignKeys

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) 

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

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

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

这似乎是正确的做法吗?任何陷阱?其他设计方法?

回答

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_savesignals。如果您想使用模型表单做一些事情,请执行obj = form.save(commit=False)并根据需要更改obj,然后执行obj.save()

相关问题