我有四个模型和一个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)。
答案 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_answers
和Response
个对象,这些对象将包含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()