我不知道标题应该是什么, 但在这里我有一个案例,如果提交了一个表单,它将从其他模型中找到数据并插入每个匹配的表单。
目前我的代码。
这是我的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)
Bar
有ForeignKey
到Foo
示例如果表单与range(30)
一起提交,则会找到Bar
并插入(append
)Foo {每个数据{1}}。现在我这样做,
id
但错误说self.object.bar.foo.append(self.object.id)
如何将'Foo' object has no attribute 'bar'
多个数据从append
插入Bar
?...
答案 0 :(得分:0)
首先,append
是list
的方法,而FK关系绝对不是列表。其次,您在related_name='foo'
模型中使用了Bar
,因此实际上您可以使用Bar
从Foo
获取foo.foo
。我确定这是一个错误。只要一个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表示单个对象,则为#include "AES.h"
。