Однопользовательское представление в Django API (Rest Framework)

Я создал API на Django с помощью rest framework, я заполняю его через Django Admin Page по умолчанию.

У меня есть несколько полей в моем API, вот мой serializers.py:

class HCSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = HomeController
        fields = ('full_name','Staff','CID', 'OI', 'Rating', 'GND', 'TWR', 'APP', 'CTR', 'Notes')


class VCSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = VisitingController
        fields = ('full_name','CID', 'OI', 'Rating', 'GND', 'TWR', 'APP', 'CTR', 'Notes')

мой views.py:

class HCViewSet(APIView):
    def get(self):
        HC = HomeController.objects.all().order_by('full_name')
        serializer = HCSerializer(HC, many=True)
        return Response(serializer.data)


class VCViewSet(APIView):
    def get(self):
        VC = VisitingController.objects.all().order_by('full_name')
        serializer = VCSerializer(VC, many=True)
        return Response(serializer.data)

мой models.py:

Мой вопрос: API работает нормально, и я могу получить все результаты, но я хочу создать endopoint типа /api/<int:CID>, который возвращает только одного пользователя. Я хотел бы использовать поле 'CID' для фильтрации. Как я могу это сделать? Спасибо!

И вам нужно создать детальные представления.

from django.http import Http404

class HCDetailViewSet(APIView):
    def get_object(self, CID):
        try:
            return HomeController.objects.get(CID=CID)
        except HomeController.DoesNotExist:
            raise Http404

    def get(self, request, CID, format=None):
        snippet = self.get_object(CID)
        serializer = HCSerializer(snippet)
        return Response(serializer.data)

class VCDetailViewSet(APIView):
    def get_object(self, CID):
        try:
            return VisitingController.objects.get(CID=CID)
        except VisitingController.DoesNotExist:
            raise Http404

    def get(self, request, CID, format=None):
        snippet = self.get_object(CID)
        serializer = VCSerializer(snippet)
        return Response(serializer.data)

А в urls.py нужно добавить URL для детальных представлений.

path('hc/<str:CID>', HCDetailViewSet.as_view(), name="hc_detail_view")
path('vc/<str:CID>', VCDetailViewSet.as_view(), name="vc_detail_view")
Вернуться на верх