Django: Правильный способ доступа к данным из отношения «один ко многим»? - PullRequest
0 голосов
/ 28 января 2020

У меня проблемы с доступом к данным через отношения django один ко многим. После 3 кропотливых дней я нашел способ отобразить данные отношения, переопределив метод get_context_data. Мне было интересно, если это был правильный способ сделать это. Это работает, но я могу представить, что есть лучший способ сделать это, который я пропустил в документации.

Вот код для этого:

class QuestionDetailView(DetailView):
    model = Question

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['answers'] = Answer.objects.filter(firm=context['object'])
        return context

Вот код для модели:

 class Question(models.Model):
    text = models.CharField(max_length=120, unique=True)

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

Вот код в моем шаблоне:

    {% extends "base.html" %}
    {% block body %}

   <div class="">
      <h3>{{ object.text }}</h3>

      <p>Answers:</p>
      <ul>
        {% for answer in answers %}
          <li> {{ answer }}</li>
        {%empty%}
          <li>No answers</li>
        {% endfor %}
      </ul>
    </div>
    {% endblock %}

1 Ответ

1 голос
/ 28 января 2020

Добавьте related_name в ваше поле question.

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="answers")

Или просто используйте значение по умолчанию, которое Django дает: answer_set

Затем в вашем шаблоне Вы можете сделать:

{% for answer in object.answers.all %} 
  <li> {{ answer }}</li>
{% empty %}
  <li>No answers</li>
{% endfor %}

Нет необходимости переопределять get_context_data, если вы не хотите сделать что-то более конкретное c с набором запросов.

...