我无法从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
我怀疑这是我做错事的地方,但我不知道该怎么办。
正如我提到的,我得到一个空的查询集,没有错误,并且能够在“管理”面板中正确看到所选的值。预先感谢您的帮助。
答案 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)