Django REST 框架过滤视图
Django REST framework filtering views
我设法使用以下配置文件从 tables MemberDeclareRecept
和 Member
获取数据。我在这里寻找 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
获得支持。
我设法使用以下配置文件从 tables MemberDeclareRecept
和 Member
获取数据。我在这里寻找 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
获得支持。