首页 > 解决方案 > 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)

标签: pythondjangodjango-rest-framework

解决方案


您可以在双下划线的帮助下过滤外键模型的属性,如下所示:

EmployeeQuestion.objects.filter(question__course__employer_id=request.user.pk)

它将在数据库级别内部自动执行内部连接。


推荐阅读