[英]Django CreateView Multiple Object Insert
我不知道标题应该是什么,但是在这里我有一个案例,如果提交了表单,它将查找其他模型中的数据并插入每个匹配的表单。
目前在这里我的代码。
这是我的models.py
class Foo(models.Model):
name = models.CharField()
value = models.DecimalField()
class Bar(models.Model):
name = models.CharField()
date = models.DateField()
foo = models.ForeignKey(Foo, related_name='foo')
这是我的views.py
class Foo(CreateView):
fields = ('name', 'value')
model = models.Foo
def form_valid(self, form):
self.object = form.save(commit=False)
for i in range(30):
self.object.bar.foo.append(self.object.id)
return super(ModelFormMixin, self).form_valid(form)
如果表单是使用range(30)
提交的,则Bar
具有ForeignKey
to Foo
示例,它将找到Bar
并为每个数据插入( append
)Foo id
。 现在我这样做
self.object.bar.foo.append(self.object.id)
但错误说'Foo' object has no attribute 'bar'
如何从Foo(CreateView)
插入append
多个数据到Bar
?...
首先, append
是list
方法,而FK关系绝对不是一个list。 其次,您在Bar
模型中使用了foo.foo
related_name='foo'
,因此实际上您可以通过使用foo.foo
从Foo
获取Bar
。 我确定这是一个错误。 只要一个Foo
可以有多个Bar
,您的related_name
应该是bars
,因此您将可以使用foo.bars.all()
。 要创建Bar
,首先应保存Foo
,因此请使用commit=True
。
最后。 在for循环中,使用Bar.objects.create(foo=self.object)
。 您还希望使用bulk_create
来优化该循环,因此您不会对数据库进行30个查询,而只会对一个查询。 要实现它,请在循环前创建一个列表bars = []
。 比在循环内部使用bars.append(Bar(foo=self.object)
。这里的append
是list
方法,因此您只是创建一个Bar
对象的列表而不将其保存到数据库中,最后在循环之后使用Bar.objects.bulk_create(bars)
以将其实际保存到数据库。
我已经重读了您的问题,也许我错过了重点。 您想如何“找到”您的Bar
? 另外,您不能将多个Foo
添加到Bar
,因为如果FK表示单个对象,则不能添加。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.