Django REST 框架过滤视图

Django REST framework filtering views

我设法使用以下配置文件从 tables MemberDeclareReceptMember 获取数据。我在这里寻找 MemberDeclareRecept.pk。但是,如果我改为搜索 Member.CoId,我怎样才能获得所有数据呢? MemberSearchByCode 视图给出了 table 中的所有成员,但我无法获取特定成员。

这是我的模型

class Member(models.Model):
    Name = models.CharField(max_length=40,null=True)
    FirstName = models.CharField(max_length=40,null=True)
    DateBirth = models.DateField(,null=True)
    CoId = models.CharField(max_length=6,null=True)

class MemberDeclareRecept(models.Model):
    SyMember=models.ForeignKey(Member,verbose_name='Name member ',null=True,related_name='Member')
    DateDeclareRecept=models.DateField(('Date received',null=True)

以及正在使用的序列化程序

class MemberDeclareSerializer(serializers.ModelSerializer):
    member = serializers.StringRelatedField(read_only=True)
    SyRecept=serializers.StringRelatedField(read_only=True)
    class Meta:
        model = MemberDeclareRecept
        fields=('id','member','SyRecept')

以及我目前使用的视图

class MemberDeclareDetail(generics.ListCreateAPIView):
    queryset=MemberDeclareRecep.objects.all()
    serializer_class =MemberDeclareSerializer
    def get_object(self,pk):
        try:
            return self.queryset.get(pk=pk)
        except MemberDeclareRecep.DoesNotExist:
            raise Http404

    def get(self, request, pk,format=None):
        entries = self.get_object(pk)
        serializer = MemberDeclareSerializer(entries)
        return Response(serializer.data)

class MemberSearchByCode(generics.ListAPIView):
    serializer_class =MemberSerializer
    def get_queryset(self):
        member=self.request.QUERY_PARAMS.get(Co_id',None)
        if membre is not None:
            queryset = queryset.filter(member__Name=member
        return queryset

您似乎找到了答案,,它包含在下面。

class MemberSearch(generics.ListAPIView):
    serializer_class=MemberDeclareSerializer

    def get_queryset(self):
        member = self.kwargs['Co_id']

        return member_declare_recept.objects.filter(member__Co_id=member)

请务必注意,这不是根据查询参数过滤查询集,而是根据 url 中存在的参数过滤查询集。如果您根据查询参数过滤它,这在您需要一次获取所有对象的列表时很有用,您将使用的 url 就像

/api/members/?company=[co_id]

这将使公司 ID 可选。不过,在您的情况下,id 被嵌入 url 本身。这通常是 referred to as hierarchal urls, and it's generally not recommended,但您的 url 最终会像

/api/company/[co_id]/members

这对某些人来说更可取,甚至在某些情况下是必需的。


现在,如果您想使用查询参数而不是 url 参数进行过滤,只需对代码稍作改动即可。

class MemberSearch(generics.ListAPIView):
    serializer_class=MemberDeclareSerializer

    def get_queryset(self):
        company_id = self.request.query_parameters.get('company', None)

        if not company_id:
            return member_declare_recept.objects.all()

        return member_declare_recept.objects.filter(member__Co_id=company_id)

这还有一个额外的好处,即直接通过 django-filter and the DjangoFilterBackend 获得支持。