代码之家  ›  专栏  ›  技术社区  ›  paceqq

Django迭代多对多对象

  •  0
  • paceqq  · 技术社区  · 8 年前

    我的主要问题是,我的代码从未进入for循环,尽管在调试器中我可以看到硬件存在。for循环被跳过了,我不明白为什么会这样。

    型号:

    class Hardware(models.Model):
        name = models.CharField(max_length=30)
        description = models.TextField()
    
    class Bundle(models.Model):
        name = models.CharField(max_length=30)
        description = models.TextField()
        devices = models.ManyToManyField(Hardware)
    
    class BundleForm(ModelForm):
    
        class Meta:
            model = Bundle
            fields = ('name', 'description', 'devices')
            labels = {
                'name': _('Bundlename'),
                'description': _('Beschreibung des Bundle'),
                'devices': _('Hardware im Bundle')
                }
    

    视图:

    elif request.method == 'POST' and 'newbundle' in request.POST:
        form = BundleForm(request.POST)
        if form.is_valid():
            bundle = form.save(commit=False)
            bundle.save()
    
            for hardware in bundle.devices.all():
                print(hardware)
    
            messages.success(request, 'Erfolg! Die Daten wurden erfolgreich gespeichert.')
            return redirect('/knowledgeeditor/bundle/', {'messages': messages})
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Community Mohan Dere    6 年前

    您的问题不是迭代多对多字段,而是保存它们。

    这个 modelforms documentation 关于使用 commit=False 使用多对多字段:

    使用的另一个副作用 提交=False 当您的模型与另一个模型具有多对多关系时,会看到。如果您的模型具有多对多关系,并且您指定 提交=False 保存表单时,Django无法立即保存多对多关系的表单数据。这是因为在数据库中存在实例之前,不可能为实例保存多对多数据。

    要解决此问题,每次使用 提交=False ,Django添加了 save_m2m() 方法创建模型表单子类。手动保存表单生成的实例后,可以调用 save\u m2m() 保存多对多表单数据。

    如上所述,您可以使用 save\u m2m() 为了节省场地,但你应该问问自己 为什么? 这里使用的是commit=False。没有理由这样做,因此您应该省略该参数和随后的单独保存,只需让表单一次保存自己。

    推荐文章