如何在 Django 中设置 URL 中的查询参数

How to set query parameters in URL in Django

我目前有一个 GET 请求,我必须在其中发送一个正文作为参数,但如前所述,无法使用正文发出 GET 请求,我想将我的参数作为查询参数传递给URL 。如何使用我目前拥有的代码执行此操作?

我的序列化器class:

@dataclass
class PlantLinkParams:
    plant_id: int
    link: str

class LnkPlantPlantByLinkSerializer(serializers.Serializer):
    plant_id = serializers.IntegerField()
    link = serializers.CharField()

    def create(self, validated_data):
        return PlantLinkParams(**validated_data)

我的观点class:

class PlantLinkAPIView(APIView):
    permission_classes = (AllowAnonymous,)
    queryset = LnkPlantPlant.objects.prefetch_related("plant", "plant_associated")

    def get(self, request):
        params_serializer = LnkPlantPlantByLinkSerializer(data=request.data)
        params_serializer.is_valid(raise_exception=True)
        params = params_serializer.save()
        data = self.getAllPlantAssociatedByLink(params)
        serializer = ReadLnkPlantPlantSerializer(instance=data, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def getAllPlantAssociatedByLink(self, params: PlantLinkParams):
        data = []
        queryset = (
            LnkPlantPlant.objects.filter(
                plant=params.plant_id,
                link=params.link,
            )
        )
        for entry in queryset:
            data.append(entry)
        return data

您可以使用 ListAPIView:

做一些更简单的事情
class PlantLinkAPIView(ListAPIView):
    permission_classes = (AllowAnonymous,)
    serializer_class = ReadLnkPlantPlantSerializer

    def get_queryset(self):
        # Retrieve the query parameters (?plant_id=xxx&link=yyy)
        try:
            plant_id = int(self.request.GET.get('plant_id'))
        except (ValueError, TypeError):
            # Prevents plant_id to be set if not a valid integer
            plant_id = None
        link = self.request.GET.get('link')

        params = {}
        if plant_id:
            params['plant__id'] = plant_id
        if link:
            params['link'] = link

        # Only filtering the queryset if one of the params is set
        if params:
            return LnkPlantPlant.objects.filter(**params)
        return LnkPlantPlant.objects.all()

你不需要更多的东西来让你的视图工作。