Django CreateView多个对象插入

时间:2018-05-20 21:40:55

标签: 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()
    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)

BarForeignKeyFoo示例如果表单与range(30)一起提交,则会找到Bar并插入(append)Foo {每个数据{1}}。现在我这样做,

id但错误说self.object.bar.foo.append(self.object.id)

如何将'Foo' object has no attribute 'bar'多个数据从append插入Bar?...

1 个答案:

答案 0 :(得分:0)

首先,appendlist的方法,而FK关系绝对不是列表。其次,您在related_name='foo'模型中使用了Bar,因此实际上您可以使用BarFoo获取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)。这里appendlist的方法,因此您只需创建Bar个对象列表而不将其保存到数据库中。最后在循环之后使用Bar.objects.bulk_create(bars)将它们实际保存到数据库中。

我重读了你的问题,也许我错过了这一点。您想如何找到'你的Bar?此外,您无法向Foo添加多个Bar,因为如果FK表示单个对象,则为#include "AES.h"