Извлечь значения ManyToManyField - PullRequest
2 голосов
/ 22 мая 2019

У меня проблемы с извлечением значений из ManyToManyField в django. Я не получаю сообщение об ошибке, просто пустой набор запросов. Вот мой код, пожалуйста, посмотрите и дайте мне знать, если я делаю что-то не так? Я правильно вижу выбранные значения в 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 Ответ

1 голос
/ 22 мая 2019

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...