如何在django rest框架中使用过滤条件查询外键值。我通过DRF StringRelatedField方法检索值,但我不知道如何在查询本身时进行过滤
models.py
class User(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Score(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user_id = models.ForeignKey(User, related_name='score', on_delete=models.CASCADE)
score = models.FloatField(null=False)
serilizer.py
class UserDetailsSerializer(serializers.ModelSerializer):
score = serializers.StringRelatedField(many=True)
class Meta:
model = User
fields = ('id', 'score', )
views.py
class UserDetailsRetrieveViewSet(viewsets.ModelViewSet):
def list(self, request):
queryset = User.objects.filter(score>=10)
serializer = UserDetailsSerializer(queryset, many=True)
答案 0 :(得分:0)
假设您需要在查看API时过滤User
个对象,而您的API为/api/v1/user/
。这种过滤可以通过两种方式实现,
1:使用 django queryset过滤器
您必须通过此类网址/api/v1/user/?score=10
传递过滤器参数。重写你的观点如下,
class UserDetailsRetrieveViewSet(viewsets.ModelViewSet):
def list(self, request):
score = request.GET.get('score', None)
queryset = User.objects.all()
if score:
queryset = queryset.filter(score__gte=score)
serializer = UserDetailsSerializer(queryset, many=True)
return Response(data=serializer.data)
2.使用 django-filter包
如果您正在尝试使用该软件包,请不要忘记安装它。您的视图将是这样的,
class UserDetailsRetrieveViewSet(viewsets.ModelViewSet):
queryset = # your queryset
serializer_class = # your serializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('score',)
def list(self, request):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def get_queryset(self):
if self.action == 'list':
return User.objects.all()
else:
return # default queryset
让我知道它是否有效。