选择具有常见问题答案的用户

时间:2019-08-02 19:23:57

标签: django django-models django-rest-framework

我有四个模型和一个CustomUser表。

class Profile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
class Question(models.Model):
    question = models.CharField(max_length=140)
class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
    answer = models.CharField(max_length=70)
class Response(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='responses')
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    answer = models.ForeignKey(Answer, on_delete=models.CASCADE)

每个问题都有多个答案,但每个用户只能为每个问题选择一个答案。

每个用户可以回答多个问题。

我如何选择一个用户列表,其中包含他们对仅使用ORM的参考用户的常见答案的嵌套列表?

我可以想到一个骇人的解决方案:检索常见答案列表,然后执行python循环以增加每个用户的计数,但是我想将其限制在ORM中,因为我需要将其附加到父序列化器( UserSerializer-> ResponseSerializer)。

1 个答案:

答案 0 :(得分:2)

我们可以在此处使用Prefetch对象,例如:

from django.db.models import Prefetch

user_answers = Answer.objects.filter(response__user=reference_user)

CustomUser.objects.prefetch_related(
    Prefetch(
        'response_set',
        queryset=Response.objects.filter(answer__in=user_answers),
        to_attr='common_answers'
    )
)

现在,此查询集产生的CustomUser个将具有一个额外的属性common_answersResponse个对象,这些对象将包含Response个带有Answer的对象他们与 reference_user 共享。

如果您只寻找具有 reference_user 至少一个常见答案的用户,则可以使用以下方法过滤掉其他用户:

CustomUser.objects.filter(
    response__answer__response__user=reference_user
).prefetch_related(
    Prefetch(
        'response_set',
        queryset=Response.objects.filter(answer__in=user_answers),
        to_attr='common_answers'
    )
).distinct()