【发布时间】:2018-12-10 00:01:32
【问题描述】:
如何使用反向外键关系生成左外连接查询并将其映射到嵌套序列化程序?我想过滤多个外键的结果。
models.py
class Question(models.Model):
question_name = models.CharField(max_length=1024)
class Paper(models.Model):
paper_name = models.CharField(max_length=128)
class Answer(models.Model):
score = models.IntegerField()
question_id = models.ForeignKey(Question, related_name='answer_questions')
paper_id = models.ForeignKey(Paper, related_name='answer_papers')
class Meta:
unique_together = ("question_id", "paper_id")
serializers.py
class PaperSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'paper_name')
model = Paper
class AnswerSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'score', 'question_id', 'paper_id')
model = Answer
class QuestionSerializer(serializers.ModelSerializer):
answer_questions = AnswerSerializer(many=True, allow_null=True)
class Meta:
fields = ('id', 'question_name', 'answer_questions')
model = Question
views.py
class QuestionList(generics.ListAPIView):
def get_queryset(self):
paper_id = self.kwargs['pk']
queryset = Question.objects.filter(answer_questions__paper_id=paper_id, answer_questions__question_id=F('id'))
return queryset
serializer_class = QuestionSerializer
我的网址是 本地主机/论文/1/问题/
预期输出: (1) 所有问题的列表,其中嵌入了仅对应的 question_id 和 paper_id(单个答案对象)的答案对象。 (2)列表应包括所有问题,无论是否回答(如果问题未回答,则应返回答案对象为空的问题),即左外连接
[
{
"id": 1,
"question_id": 1,
"answer_questions": [
{
"id": 24,
"score": 5,
"question_id": 1,
"paper_id": 1
},
{
"id": 27,
"score": 8,
"question_id": 1,
"paper_id": 2
},
{
"id": 28,
"score": 6,
"question_id": 1,
"paper_id": 3
}
]
}
]
电流输出: (1) 我得到了特定 question_id 包括所有 paper_id 的多个答案对象。即对于 question_id = 1 和 paper_id = 2,我的输出显示问题的答案对象为 question_id = 1 未在 paper_id 上过滤。 (2) 只回答问题(因为查询是内连接查询)
[
{
"id": 1,
"question_id": 1,
"answer_questions": [
{
"id": 24,
"score": 5,
"question_id": 1,
"paper_id": 1
}
]
}
]
如果这不是一个好的实现方法,请提出更好的优化方法。
【问题讨论】:
标签: django django-rest-framework django-orm