繁体   English   中英

Django CreateView多对象插入

[英]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 ?...

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

我已经重读了您的问题,也许我错过了重点。 您想如何“找到”您的Bar 另外,您不能将多个Foo添加到Bar ,因为如果FK表示单个对象,则不能添加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM