首页 > 解决方案 > 提取 ManyToManyField 值

问题描述

我无法从 django 中的 ManyToManyField 中提取值。我没有收到错误,只是一个空的查询集。这是我的代码,如果我做错了什么,请你看一下,让我知道吗?我可以在 Admin 中正确查看所选值,这使我相信我可能已正确存储了这些值,但我无法在我的 views.py 中检索这些值。

模型.py

class Colors(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    ColorId = models.CharField(primary_key=True, max_length=100)
    ColorName = models.CharField(default='Na', max_length=100)

    class Meta:
        ordering = ('ColorName',)

    def __str__(self):
        return self.ColorName


class Bike(models.Model):
    colors= models.ManyToManyField(Colors)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

表格.py

class SettingsUpdateForm(forms.ModelForm):
    colors = forms.ModelMultipleChoiceField(queryset=Colors.objects.all())

class Meta:
    model = Bike
    fields = [
              'colors',
              ]

我的 html 模板中的一个片段

<div class="form-group col-sm-8 col-md-6">
{{ p_form.colors.label_tag }}
{% render_field p_form.colors class="form-control" %}
</div>

我可以通过执行以下操作来获取我保存的其他参数:

bikes= Bike.objects.all()
colors= bikes.colors

我怀疑这是我做错了什么,但我不知道是什么。

正如我所提到的,我得到一个空的查询集,没有错误,并且我能够在我的管理面板中正确地看到选定的值。在此先感谢您的帮助。

标签: django

解决方案


Bike.objects.all()返回一个查询集 - 所有自行车的列表。无论您的字段是什么类型,您都不能直接在查询集上访问该字段;仅在该查询集中的单个模型上。因此,您将始终需要遍历bikes.

但是,对于多对多,该字段的值本身就是一个查询集。因此,您需要迭代每辆自行车的颜色。例如:

for bike in Bike.objects.all():
    print(bike.name) #  assuming it has a name
    for color in bike.colors.all():
        print(color.ColorName)

推荐阅读