Django REST框架过滤视图

时间:2015-01-10 07:42:24

标签: python django django-rest-framework

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

以下是我的模特

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

1 个答案:

答案 0 :(得分:0)

好像您已找到答案based on the comment,并且它包含在下面。

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,而且是generally not recommended,但您的网址最终会像

一样
/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支持。