Перечисление ответов на вопрос (get_object_or_404) для l oop. Как я могу получить каждый ответ как объект в одном определении? - PullRequest
1 голос
/ 06 мая 2020

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

У меня есть небольшая система голосования для моих объектов вопросов. На мои вопросы есть много ответов, которые я перечисляю в "question_details" для l oop. Я, конечно, могу получить доступ к модели вопросов и, следовательно, получить информацию о голосовании за вопрос, но я не могу сделать то же самое для каждого ответа. Может быть, какой-нибудь код для лучшей иллюстрации:

views.py:

def questiondetails(request, question_pk):
    question = get_object_or_404(Question, pk=question_pk)
    question_form_id = question
    total_voteup = question.total_voteup()
    total_votedown = question.total_votedown()
    is_voteup = False
    is_votedown = False
       if question.voteup.filter(id=request.user.id).exists():
           is_voteup = True
       if question.votedown.filter(id=request.user.id).exists():
           is_votedown = True

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

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

{% for answer in question.answer_set.all %}
    {{ answer }}<br>
    <div id="answer_voting_section">
    {% include 'main/partials/answer_voting_section.html' %}
    </div>
{% endfor %}

И с этим. Я могу нажать на свой вопрос, он вызовет "questiondetails" и приведет меня на страницу с вопросами и ответами, исходящими из этого для l oop.

И моя проблема в том, что я хотел бы получить доступ " total_voteup "(и другие вещи) для каждого ответа из этого для l oop.

Как я могу это сделать? Я новичок в python на django, поэтому я понимаю, что могу делать это только с вопросами и деталями вопросов, потому что Я ПРОХОДЯ "question_pk". Могу ли я в том же DEF получить доступ к ответам, связанным с этим вопросом? Или это невозможно, потому что эти данные "пока не видны" для django?

@ Edit:

Мои модели:

class Question(models.Model):
    question = models.CharField(max_length=300)
    answered = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    datecompleted = models.DateTimeField(null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    voteup = models.ManyToManyField(User, related_name='voteup', blank=True)
    votedown = models.ManyToManyField(User, related_name='votedown', blank=True)

    def __str__(self):
        return self.question

    def total_voteup(self):
        return self.voteup.count()

    def total_votedown(self):
        return self.votedown.count()


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)
    answer_voteup = models.ManyToManyField(User, related_name='answer_voteup', blank=True)
    answer_votedown = models.ManyToManyField(User, related_name='answer_votedown', blank=True)

    def __str__(self):
        return self.answer

    def total_answer_voteup(self):
        return self.answer_voteup.count()

    def total_answer_votedown(self):
        return self.answer_votedown.count()

1 Ответ

1 голос
/ 07 мая 2020

Несмотря на то, что в вашем коде много избыточности, и ваша модель ответа не требует использования поля question_id django создаст идентификатор для вас, предполагается, что поле ответа скорее будет иметь отношение models.OneToMany. но вы можете импортировать модель ответа в представление и сделать что-то подобное, как вы делали для опроса, проголосовать за и отрицать внутри того же представления, то есть answer_upvote = Answer.objects.filter (question_id = question) .total_answer_voteup () answer_downvote = Answer.objects.filter ( question_id = question) .total_answer_votedown ()

Лог c, который я пытаюсь использовать, получает все объекты, связанные с каждым вопросом

, но таким образом вы можете обойтись.

...