python - Django REST API - 在查询中加入多个表
问题描述
我的目标是获取所有 EmployeeQuestions,这样员工就有一个具有给定 ID(request.user.pk)的雇主。更正式地说,我想获取所有 EmployeeQuestions,其中 question 有一个课程,其中employer_id 是给定的 id。
我希望这是有道理的。基本上作为雇主,我想检索所有员工的所有问题进度。
我以为我做了正确的查询,但它只返回所有 EmployeeQuestions:
EmployeeQuestion.objects.filter(question__in=CourseQuestion.objects.filter(course__in=Course.objects.filter(employer_id=request.user.pk)))
这里有任何 Django 查询天才可以帮助我吗?:)
看法
class EmployeeQuestionByEmployerId(viewsets.ModelViewSet):
queryset = EmployeeQuestion.objects.all()
serializer_class = EmployeeQuestionSerializer
def list(self, request):
queryset = EmployeeQuestion.objects.all()
if request.query_params:
queryset = EmployeeQuestion.objects.filter(question__in=CourseQuestion.objects.filter(course__in=Course.objects.filter(employer_id=request.user.pk)))
serializer = EmployeeQuestionSerializer(queryset, many=True)
return Response(serializer.data)
楷模
class CustomUser(AbstractBaseUser):
username = ...
employer = models.ForeignKey("self", blank=True, null=True, on_delete=models.CASCADE)
class Course(models.Model):
employer_id = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=255, blank=False, null=False)
class Question(models.Model):
course = models.ForeignKey(Course, on_delete=models.CASCADE, null=False)
question = models.CharField(max_length=255, blank=False, null=False)
question_type = models.CharField(max_length=255, blank=False, null=False) # mult/ord/open
class EmployeeQuestion(models.Model):
employee = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True)
question = models.ForeignKey(CourseQuestion, on_delete=models.CASCADE, null=False)
passed = models.BooleanField(default=False)
解决方案
您可以在双下划线的帮助下过滤外键模型的属性,如下所示:
EmployeeQuestion.objects.filter(question__course__employer_id=request.user.pk)
它将在数据库级别内部自动执行内部连接。
推荐阅读
- c++ - 在整个程序执行过程中存储文件句柄有什么缺点吗?
- node.js - Windows 10 中未安装 Angular cli
- html - Laravel + Ajax,将数据呈现给 html 的正确方法
- xamarin - 如何在 Android 中为 AppAuth 库实现意图?
- r - xts 和数据帧中单个值的比较失败
- google-api - Google Drive API V3 - changes.watch "params" 属性
- sql - 简单的 JSON 数组到行
- angular - 尝试修改 Ionic 3 中某些页面中的硬件后退按钮行为
- clips - CLIPS 6.3 IF 语句
- java - Is it possible to embed a Python/Django app in a Java Web App?