Извлечь значения ManyToManyField

У меня проблемы с извлечением значений из 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

Я подозреваю, что здесь я делаю что-то не так, но я не могу понять, что.

Как я уже упоминал, я получаю пустой набор запросов, ошибок нет, и я могу правильно видеть выбранные значения в своей панели администратора. Заранее спасибо за вашу помощь.

Где вы пытаетесь «извлечь» значения? Единственный шаблон, который вы показали здесь, — это форма.

Daniel Roseman 22.05.2019 15:25

Попробуйте это for bike in bikes: print(bike.colors)

HariHaraSudhan 22.05.2019 15:26

@DanielRoseman, я пытаюсь извлечь значения из моего файла views.py.

jvanheijzen 22.05.2019 15:41

@HariHaraSudhan, я пробовал. Он говорит, что объект «ManyRelatedManager» не является итерируемым

jvanheijzen 22.05.2019 15:42

Ой извините., for bike in bikes: print(bike.colors.objects.all())

HariHaraSudhan 22.05.2019 15:46
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
5
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Благодарю за ваш ответ. Я попробую. В конечном счете, я смотрю, какие варианты выбрал пользователь. В этом примере, если мой список цветов черный, красный, синий, белый, зеленый и т. д., а пользователь хочет видеть только черные и красные велосипеды, как я смогу найти, какие элементы выбраны в ModelMultipleChoiceField?

jvanheijzen 22.05.2019 18:25

Но это не имеет ничего общего с полем многие ко многим. Связь между User и Color представляет собой прямой внешний ключ и не проходит через Bike. Вы бы просто сделали request.user.colors_set.all().

Daniel Roseman 22.05.2019 18:41

А, понял. Спасибо. Я отметил ваш как ответ.

jvanheijzen 22.05.2019 18:52

Другие вопросы по теме