Как я могу перечислить все ответы от модели ответа на мою модель вопроса в Django? Отношение много к одному? - PullRequest
0 голосов
/ 19 апреля 2020

Я хотел бы попросить вас о помощи.

У меня есть две модели. Вопрос и ответ. Один вопрос может иметь много ответов. Мои модели выглядят так:

class Question(models.Model):
    question = models.CharField(max_length=300)
    answered = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    votesscore = models.IntegerField(default='0')
    amountofvotes = models.IntegerField(default='0')

    def __str__(self):
        return self.question


class Answer(models.Model):
    question_id = models.ForeignKey(Question, on_delete=models.CASCADE, blank=False, null=True)
    answer = models.TextField(max_length=1000)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    votesscore = models.IntegerField(default='0')
    amountofvotes = models.IntegerField(default='0')

    def __str__(self):
        return self.answer

Вот мои взгляды.py:

def home(request):
    allquestionswithanswers = Answer.objects.prefetch_related('question_id')
    allquestionswithoutanswers = Question.objects.filter(answered = False)
    return render(request, 'main/home.html', {'allquestionswithanswers': allquestionswithanswers, 'allquestionswithoutanswers': allquestionswithoutanswers})

А вот и мой дом. html:

<h1>Questions with answers:</h1>
<ul>
    {% for allquestionwithanswer in allquestionswithanswers %}
    <li>
        {{ allquestionwithanswer.question_id }} {{ allquestionwithanswer.user }}<br><br>
        <br><br>
        {{ allquestionwithanswer.answer }}
    </li>
    {% endfor %}

</ul>

<h1>Questions without answers:</h1>
<ul>
    {% for allquestionwithoutanswer in allquestionswithoutanswers %}
    <li>
        {{ allquestionwithoutanswer.question }} {{ allquestionwithoutanswer.user }}
        <br><br>
        {{ allquestionwithoutanswer.answer }}
    </li>
    {% endfor %}

</ul>

И некоторые вещи работают, а некоторые нет, и я не понимаю, как я могу их исправить: (

У меня работает "Вопросы с ответами:". Это список моего вопроса и соответствующего ответа, но если вопрос имеет несколько ответов, печатает вопрос много раз, каждый раз со следующим ответом. Мне бы хотелось, чтобы это выглядело так: -Вопрос 1 -Ответ 1 -Ответ 2 -Вопрос 1 -Ответ1

Я знаю, что я должен go с вложенными циклами, но я поэкспериментировал с ним, и я не могу заставить его работать.

И моя вторая проблема: в "Вопросах без ответов:" Я хочу перечислить все вопросы, на которые логическое "ответил" = Ложь. Но можно установить значение false, но иметь несколько ответов, и если это произойдет, я бы тоже хотел перечислить эти ответы. Но здесь у меня проблема с моделями, поскольку модель вопроса не имеет информации об ответе. Это работает только по-другому.

Буду очень признателен за любую помощь и указания.

Спасибо и ура!

1 Ответ

1 голос
/ 19 апреля 2020

Чтобы решить проблему, когда вопрос печатается несколько раз, вам нужно посмотреть, что на самом деле делает ваш l oop:

{% for allquestionwithanswer in allquestionswithanswers %}
    <li>
        {{ allquestionwithanswer.question_id }} {{ allquestionwithanswer.user }}
        <br><br><br><br>
        {{ allquestionwithanswer.answer }}
    </li>
{% endfor %}

Здесь вы просматриваете коллекцию allquestionswithanswers - но это не набор вопросов, это набор ответов! Таким образом, вы выполняете l oop для каждого ответа в коллекции и распечатываете вопрос и ответ каждый раз, когда запускается l oop (по одному на ответ в коллекции).

Вам необходимо работать из коллекции questions - и вы не правы, что отношения работают только в одну сторону. Ваши вопросы знают о ответах, связанных с ними. Фактически, существует соглашение Django для получения набора ответов для определенного вопроса. Вы добавляете _set к названию модели, в этом случае это будет answer_set. Для ваших моделей вы должны использовать набор запросов question.answer_set.all, чтобы получить все ответы на конкретный вопрос.

Так попробуйте это:

По вашему мнению:

def home(request):
    allquestionswithanswers = Question.objects.filter(answered = True)
    allquestionswithoutanswers = Question.objects.filter(answered = False)

    return render(request, 'main/home.html', {'allquestionswithanswers': allquestionswithanswers, 'allquestionswithoutanswers': allquestionswithoutanswers})

и в шаблоне представления:

<h1>Questions with answers:</h1>
<ul>
    {% for question in allquestionswithanswers %}
        <li>
            {{ question.id }} {{ question.user }}
            <br><br><br><br>
            {% for answer in question.answer_set.all %}
                {{ answer }}
            {% endfor %}
        </li>
    {% endfor %}
</ul>

<h1>Questions without answers:</h1>
<ul>
    {% for question in allquestionswithoutanswers %}
        <li>
            {{ question }} {{ question.user }}
            <br><br>
            {% for answer in question.answer_set.all %}
                {{ answer }}
            {% endfor %}
        </li>
    {% endfor %}
</ul>

Дайте мне знать, как это работает. Кроме того, если вы еще этого не сделали, изучите учебник Django от начала до конца sh. Он проведет вас через создание приложения опроса, которое почти точно такой же структуры модели, как ваше приложение (вопросы / ответы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...