提取ManyToManyField值

时间:2019-05-22 13:20:21

标签: django

我无法从Django的ManyToManyField提取值。我没有收到错误,只是一个空的查询集。这是我的代码,您能看看我是否做错了吗?我可以在Admin中正确看到所选的值,这使我相信我可能已经正确存储了这些值,但是我无法在views.py中检索这些值。

models.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)

forms.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

我怀疑这是我做错事的地方,但我不知道该怎么办。

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

1 个答案:

答案 0 :(得分:1)

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)