Django REST API - одна конечная точка для CRUD - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь сопоставить GET/PUT/DELETE методы HTTP с одной конечной точкой REST API Django.Я могу переопределить метод get_queryset по умолчанию, чтобы по существу выполнить запрос GET для определенного поля модели в БД, но я не уверен, какие методы класса следует переопределить для PUT/DELETE.Если я использую postman для выполнения PUT/DELETE, я получаю ошибку method not allowed.

Models.py

class Computer(models.Model):
    computer_id = models.IntegerField(unique=True)
    city = models.CharField(max_length=50)
    description = models.TextField(null=True, blank=True)

    def __str__(self):
        return str(self.computer_id)

Urls.py

router.register(r'computer/(?P<comp_id>[0-9]+)',  ComputerViewSet, base_name='computers') 

Views.py

class ComputerViewSet(viewsets.ModelViewSet):

    serializer_class = ComputerSerializer

    def get_queryset (self, *args, **kwargs):
        comp_id = self.kwargs['comp_id']
        queryset = Computer.objects.filter(computer_id=comp_id)
        return queryset

Serializers.py

class ComputerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Computer
        fields = ('id', 'computer_id', 'city', 'description')

Поэтому я попытался безуспешно переопределить другие методы в классе в Views.py:

def destroy(self, request, *args, **kwargs):
    computer = self.get_object()
    self.perform_destroy(computer)
    computer.delete()

def update(self, request, *args, **kwargs):
    #...

Моя цель - иметь одну конечную точку с GET/PUT/DELETE возможностями.Как я могу начать это?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Измените определение вашего маршрутизатора на,

router.register(<b>r'computer',</b>  ComputerViewSet, base_name='computers')
решит проблему

Кроме того, get_queryset() похоже, что вы пытаетесь получить подробности экземпляра компьютера , который эквивалентен detail API .Установив определение router , как указано выше, вы будете иметь несколько конечных точек, как указано здесь

Итак, /api/computer/ вернет все результаты и /api/computer/123/ вернет данные Computer экземпляра, чей PK равен 123

Рекомендованный фрагмент кода

# urls.py
router.register(r'computer', ComputerViewSet, base_name='computers')


# views.py
class ComputerViewSet(viewsets.ModelViewSet):
    queryset = Computer.objects.all()
    serializer_class = ComputerSerializer
    lookup_field = 'computer_id'
    # not required any kind of override here [for now :) ]
0 голосов
/ 04 октября 2018

Вы можете выполнять такие операции.

class Example(APIView):

    def get(self, request):
         your code
         return Response(....)

    def post(self, request):
         your code
         return Response(....)

    def put(self, request):
        your code
        return Response(.....)

    def delete(self, request):
        your code
        return Response(....)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...