Django ModelForm 使用不同的外键创建多个实例
Django ModelForm create multiple instances with different ForeignKeys
在我的 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
个实例之一。
基本上我正在做的是制作 "Bulk Creation" Foo。我不想使用多对多,因为我不想将一个 Foo 对象绑定到三个 Bar 对象。我希望每个 Bar 都有自己独特的 Foo。
我想我可以使用 ModelForm,当我实例化它时,可能会添加一些对我的 Bar 实例的引用,然后覆盖模型窗体上的 save()
以创建 "duplicate" 条目。我的模型表单不会包含 bar
字段,因为我将手动处理它。
这看起来是正确的方法吗?有什么陷阱吗?其他设计方法?
没你想的那么复杂。在 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.
你的方法有一个陷阱,你应该尽量避免覆盖 model/model 表单 save()
方法,它会搞砸很多事情 and/or 让事情变得复杂。如果你想在模型上使用额外的步骤来保存一些东西,请使用 django pre_save
或 post_save
signals。如果你想用模型形式做一些事情,做 obj = form.save(commit=False)
并根据需要改变 obj
,然后做 obj.save()
.
在我的 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
个实例之一。
基本上我正在做的是制作 "Bulk Creation" Foo。我不想使用多对多,因为我不想将一个 Foo 对象绑定到三个 Bar 对象。我希望每个 Bar 都有自己独特的 Foo。
我想我可以使用 ModelForm,当我实例化它时,可能会添加一些对我的 Bar 实例的引用,然后覆盖模型窗体上的 save()
以创建 "duplicate" 条目。我的模型表单不会包含 bar
字段,因为我将手动处理它。
这看起来是正确的方法吗?有什么陷阱吗?其他设计方法?
没你想的那么复杂。在 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.
你的方法有一个陷阱,你应该尽量避免覆盖 model/model 表单 save()
方法,它会搞砸很多事情 and/or 让事情变得复杂。如果你想在模型上使用额外的步骤来保存一些东西,请使用 django pre_save
或 post_save
signals。如果你想用模型形式做一些事情,做 obj = form.save(commit=False)
并根据需要改变 obj
,然后做 obj.save()
.