Python Django CreateView多对象插入
我不知道该叫什么名字, 但这里我有一个例子,如果提交表单,它将从其他模型中查找数据,并插入每个匹配的数据 现在这里是我的代码 这里是我的Python Django CreateView多对象插入,python,django,django-views,Python,Django,Django Views,我不知道该叫什么名字, 但这里我有一个例子,如果提交表单,它将从其他模型中查找数据,并插入每个匹配的数据 现在这里是我的代码 这里是我的models.py class Foo(models.Model): name = models.CharField() value = models.DecimalField() class Bar(models.Model): name = models.CharField() date = models.DateField
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')
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)
这里是我的视图.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')
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
示例如果提交的表单带有范围(30)
它将查找Bar
,并为每个数据插入(append
)Fooid
。现在我做这个
self.object.bar.foo.append(self.object.id)
但错误说明“foo”对象没有属性“bar”
如何从
Foo(CreateView)
向Bar
插入append
多个数据?…首先,append
是list
的方法,FK关系绝对不是列表。其次,您在Bar
模型中使用了related\u name='foo'
,因此实际上您可以使用foo.foo
从foo
获取Bar
。我确信这是一个错误。只要一个Foo
可以有许多Bar
,您的相关的\u名称应该是Bar
,这样您就可以使用Foo.Bar.all()
。
要创建条形图
,您应该首先保存Foo
,因此使用commit=True
最后一个。在for循环中使用Bar.objects.create(foo=self.object)
。
您还希望使用bulk\u create
来优化该循环,这样您就不会对数据库进行30次查询,而只进行一次查询。要实现它,请在循环之前创建一个列表bar=[]
。比内部循环使用Bar.append(Bar(foo=self.object)
。这里append
是list
的方法,所以您只需创建一个Bar
对象的列表,而不将它们保存到数据库中。最后在循环之后使用Bar.objects.bulk\u创建(Bar)
,将它们实际保存到数据库中
我重读了你的问题,也许我没有抓住重点。你想如何“找到”你的条形图?另外,你不能在你的条形图中添加多个Foo
,因为它是if FK,意思是单个对象。谢谢,所以在你的回答中,`另外,你不能在条形图中添加多个Foo,因为它是if FK,意思是singl因此没有办法更新foo=models.ForeignKey(foo,related_name='foo'))
?…如果我有30条对象,需要更新它。现在还不清楚你想要实现什么。你的30条对象在哪里?你如何从发布的表单中获取它们?如果它们都引用同一个Foo,如果我理解正确,你只需用新数据更新它。那么你根本不需要Bar,只需upd吃了Foo对象