在我的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
字段,因为我手动处理它。
这看起来是正确的做法吗?任何陷阱?其他设计方法?
答案 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_save
或post_save
signals。如果您想对模型表单执行某些操作,请执行obj = form.save(commit=False)
并根据需要更改obj
,然后执行obj.save()
。