代码之家  ›  专栏  ›  技术社区  ›  Dicky Raambo

Django CreateView多对象插入

  •  0
  • Dicky Raambo  · 技术社区  · 6 年前

    我不知道标题应该是什么, 但在这里我有一个例子,如果提交了一个表单,它将找到来自其他模型的数据,并插入每个匹配的数据。

    现在这里是我的代码。

    这是我的 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) 它会找到 酒吧 并插入( append )富 id 每一个数据。现在我来处理这个,

    self.object.bar.foo.append(self.object.id) 但错误是说 'Foo' object has no attribute 'bar'

    如何插入 追加 多个数据到 酒吧 Foo(CreateView) ?…

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alexandr Tatarinov    6 年前

    首先, append 是的方法 list 而fk关系绝对不是一个列表。第二,你已经使用了 related_name='foo' 在你的 Bar 模型,所以实际上你可以 酒吧 Foo 通过使用 foo.foo . 我确信这是一个错误。只要一个 可以有很多 酒吧 ,您的 related_name 应该是 bars ,这样您就可以使用 foo.bars.all() . 创建 酒吧 你应该先救你的 ,所以使用 commit=True .
    最后一个。在循环使用中 Bar.objects.create(foo=self.object) . 您还想使用 bulk_create 为了优化这个循环,您不需要对数据库进行30次查询,而只需要一次查询。要实现它,请创建一个列表 bars = [] 循环前。比内部循环使用 bars.append(Bar(foo=self.object) . 在这里 追加 是的方法 列表 ,因此您只需创建 酒吧 对象而不将其保存到数据库中。最后循环使用后 Bar.objects.bulk_create(bars) 将它们实际保存到数据库中。

    我重读了你的问题,也许我错过了要点。你想如何“找到”你的 酒吧 ?此外,不能添加多个 给你的 酒吧 因为它如果fk这意味着单个对象。