У меня проблемы с извлечением значений из ManyToManyField в django. Я не получаю ошибку, просто пустой набор запросов. Вот мой код, не могли бы вы взглянуть и сообщить мне, если я делаю что-то не так? Я правильно вижу выбранные значения в 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
Я подозреваю, что здесь я делаю что-то не так, но я не могу понять, что.
Как я уже упоминал, я получаю пустой набор запросов, ошибок нет, и я могу правильно видеть выбранные значения в своей панели администратора. Заранее спасибо за вашу помощь.
Попробуйте это for bike in bikes: print(bike.colors)
@DanielRoseman, я пытаюсь извлечь значения из моего файла views.py.
@HariHaraSudhan, я пробовал. Он говорит, что объект «ManyRelatedManager» не является итерируемым
Ой извините., for bike in bikes: print(bike.colors.objects.all())
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)
Благодарю за ваш ответ. Я попробую. В конечном счете, я смотрю, какие варианты выбрал пользователь. В этом примере, если мой список цветов черный, красный, синий, белый, зеленый и т. д., а пользователь хочет видеть только черные и красные велосипеды, как я смогу найти, какие элементы выбраны в ModelMultipleChoiceField?
Но это не имеет ничего общего с полем многие ко многим. Связь между User и Color представляет собой прямой внешний ключ и не проходит через Bike. Вы бы просто сделали request.user.colors_set.all()
.
А, понял. Спасибо. Я отметил ваш как ответ.
Где вы пытаетесь «извлечь» значения? Единственный шаблон, который вы показали здесь, — это форма.