Django迭代多个对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django迭代多个对象相关的知识,希望对你有一定的参考价值。

我的主要问题是我的代码永远不会进入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})
答案

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

modelforms documentation有关于使用commit=False与多对多字段的说法:

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

要解决此问题,每次使用commit=False保存表单时,Django都会向您的ModelForm子类添加save_m2m()方法。手动保存表单生成的实例后,可以调用save_m2m()来保存多对多表单数据。

如前所述,你可以使用save_m2m()来保存字段,但是你应该问问自己为什么你在这里使用commit = False。没有理由这样做,所以你应该省略该参数和随后的单独保存,然后让表单一次性保存。

以上是关于Django迭代多个对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中更新多个对象

通过 ORM 删除多个 Django 对象

Django'logout'TypeError:'AnonymousUser'对象不可迭代

在 python/Django 中多次迭代 json 对象

TypeError:无法在 Django 视图函数中解压不可迭代的 int 对象

如何在UL中迭代使用appendChild和片段LI?