django - 如何在django_rest_framework APIView中配置ID参数

标签 django django-rest-framework django-views

我的目标是指定允许我在 URL 中输入 ID 的行为。

目前,我可以向 URL“localhost:8000/api/players/?id=#”发送 GET、PUT 和 PATCH 请求,其中哈希值代表玩家 ID

我想更新我的代码,以了解如果我向“localhost:8000/api/players/2”发送 GET/PUT/PATCH 请求,我正在寻找 id=2 的玩家

我的模型.py

class player(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    team = models.CharField(max_length=50)
    position = models.CharField(max_length=50)
    number = models.IntegerField()

    def __str__(self):
        return "{}, {}".format(self.first_name, self.last_name)

我的序列化器.py

class playerSerializer(serializers.ModelSerializer):

    class Meta:
        model = player
        fields = ['id', 'first_name', 'last_name', 'team', 'position', 'number']

我的观点.py

from django.shortcuts import render
from django.http import HttpResponse, response
from django.shortcuts import get_object_or_404
from rest_framework import serializers
from rest_framework. serializers import Serializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from main.models import player
from .serializers import playerSerializer
import json


class playerList(APIView):

    serializer_class = playerSerializer
    throttle_scope = "main_app"

    def get_queryset(self, *args, **kwargs):
        players = player.objects.all()
        return players

    def get(self, request, *args, **kwargs):     
        try:
            id = request.query_params["id"]
            if id != None:
                player_object = player.objects.get(id=id)
                serializer = playerSerializer(player_object)
        except:
            players = self.get_queryset()
            serializer = playerSerializer(players, many=True)

        return Response(serializer.data)

    def post(self, request):
        player_data = request.data
        new_player = player.objects.create(
            first_name=player_data['first_name'],
            last_name=player_data['last_name'],
            team=player_data['team'],
            position=player_data['position'],
            number=player_data['number']
        )
        new_player.save()

        serializer = playerSerializer(new_player)
        return Response(serializer.data)

    def put(self, request, *args, **kwargs):
        id = request.query_params["id"]
        player_object = player.objects.get(id=id)

        data = request.data

        player_object.first_name = data["first_name"]
        player_object.last_name = data["last_name"]
        player_object.team = data["team"]
        player_object.position = data["position"]
        player_object.number = data["number"]

        player_object.save()

        serializer = playerSerializer(player_object)
        return Response(serializer.data)
    
    def patch(self, request, *args, **kwargs):
        id = request.query_params["id"]
        player_object = player.objects.get(id=id)

        data = request.data

        player_object.first_name = data.get('first_name', player_object.first_name)
        player_object.last_name = data.get('last_name', player_object.last_name)
        player_object.team = data.get('team', player_object.team)
        player_object.position = data.get('position', player_object.position)
        player_object.number = data.get('number', player_object.number)

        player_object.save()
        serializer = playerSerializer(player_object)
        return Response(serializer.data)

我的 urls.py

urlpatterns = [
    url('players', playerList.as_view()),
]

我已经被这个问题困扰了几天......任何指导将不胜感激。

谢谢, 奥斯汀H

最佳答案

View .py


class playerList(APIView):

    serializer_class = playerSerializer
    throttle_scope = "main_app"
    

    def get(self, request, *args, **kwargs):     
        try:
            # id = request.query_params["id"]
            id = self.kwargs["id"]
              if id != None:
                player_object = player.objects.get(id=id)
                serializer = playerSerializer(player_object)
        except:
            players = self.get_queryset()
            serializer = playerSerializer(players, many=True)

        return Response(serializer.data)

    def post(self, request):
        player_data = request.data
        new_player = player.objects.create(
            first_name=player_data['first_name'],
            last_name=player_data['last_name'],
            team=player_data['team'],
            position=player_data['position'],
            number=player_data['number']
        )
        new_player.save()

        serializer = playerSerializer(new_player)
        return Response(serializer.data)

    def put(self, request, *args, **kwargs):
        #id = request.query_params["id"]
        id = self.kwargs["id"]
        player_object = player.objects.get(id=id)

        data = request.data

        player_object.first_name = data["first_name"]
        player_object.last_name = data["last_name"]
        player_object.team = data["team"]
        player_object.position = data["position"]
        player_object.number = data["number"]

        player_object.save()

        serializer = playerSerializer(player_object)
        return Response(serializer.data)
    
    def patch(self, request, *args, **kwargs):
        #id = request.query_params["id"]
        id = self.kwargs["id"]
        player_object = player.objects.get(id=id)

        data = request.data

        player_object.first_name = data.get('first_name', player_object.first_name)
        player_object.last_name = data.get('last_name', player_object.last_name)
        player_object.team = data.get('team', player_object.team)
        player_object.position = data.get('position', player_object.position)
        player_object.number = data.get('number', player_object.number)

        player_object.save()
        serializer = playerSerializer(player_object)
        return Response(serializer.data)

url.py

urlpatterns = [
    url('players/<int:id>/', playerList.as_view()),
]

关于django - 如何在django_rest_framework APIView中配置ID参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69268571/

相关文章:

python - Django 模板中的动态列数

django - 当直接指向模板时如何在 urls.py 中缓存 View

python - 如何从 Django Headers 获取数据?

python - 将一个休息资源路由为第二个休息资源的子资源

json - 在 ChoiceField 中返回 display_name

python - django 上的代码 200 httpresponse

django - 序列化程序嵌套关系无法正常工作

Django:检查测试中响应的内容类型

python/django,命名空间的根在哪里?

python - Django 模型 - 创建仅链接两个表的模型是一个好习惯吗?