Как выбрать только вопросы, на которые еще не ответил пользователь в Django - PullRequest
1 голос
/ 08 октября 2019

Я создаю тест и хотел бы показать пользователю только вопросы, на которые он не ответил сам. Как мне это сделать?

models.py

class Questao(models.Model):
    idQuestao = models.CharField(
        max_length=7,
        primary_key=True,
        null=False,
        verbose_name="ID da questão")

class Resposta(models.Model):
    idQuestao = models.ForeignKey(
        Questao,
        on_delete=models.CASCADE,
        verbose_name="ID da questão")
    usuario = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        verbose_name="Usuário")

views.py

questao = Questao.objects.filter(tipoQuestao=1, resposta__usuario=request.user)\
    .exclude(idQuestao=Resposta.objects.filter())\
    .order_by("?")\
    .first()

РЕДАКТИРОВАТЬ

Когда я вошел в тест, меня попросили ответить на вопрос E200501, но тот, на который был дан ответ, был E200503.

enter image description here

enter image description here

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Чтобы исключить вопросы, на которые пользователь уже ответил, я бы предложил использовать .annotate() с Count (и, возможно, даже Case/When) длясосчитать связанные элементы в одном запросе и отфильтровать их.

from django.db import models

questao = Questao.objects\
    .annotate(
        resp_count=models.Count(
            models.Case(
                models.When(resposta__usuario=request.user, then=1),
                output_field=models.IntegerField())))\
    .filter(tipoQuestao=1, resp_count=0)\
    .order_by("?")\
    .first()

Будет ли это работать для вас?

0 голосов
/ 08 октября 2019

Я предполагаю, что всякий раз, когда пользователь отвечает на вопрос, Resposta объект создается, если вы просто хотите вернуть Questao, на который пользователь еще не ответил, вам просто нужно exclude()

questao = Questao.objects.exclude(resposta__usuario=request.user)
...