我的目標是指定行為,允許我在我的 URL 中輸入 ID。
目前,我能夠向 URL'localhost:8000/api/players/?id=#'發送 GET、PUT 和 PATCH 請求,其中的哈希值代表玩家 ID
。我想更新我的代碼,以了解如果我向'localhost:8000/api/players/2'發送GET/PUT/PATCH請求,我正在尋找一個id=2的玩家
。my models.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)
my serializer.py
class playerSerializer(serializers.ModelSerializer)。
class Meta:
model = player
fields = ['id'/span>, 'first_name'/span>, 'last_name'/span>, 'team', 'position', 'number']
my views.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.view 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)。
序列化器_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"/span>]
if id != None:
player_object = player.object.get(id=id)
序列化器 = playerSerializer(player_object)
except:
players = self.get_queryset()
serializer = playerSerializer(player, 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"/span>]
player_object = player.object.get(id=id)
data = request.data
player_object.first_name = data["first_name"/span>]
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"/span>]
player_object = player.object.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)
my urls.py
urlpatterns = [
url('player', playerList.as_view())。
]
我已經被這個問題困擾了好幾天了......如果有任何指導,我將非常感激。
謝謝。 Austin H
uj5u.com熱心網友回復:
views.py
。
class playerList(APIView)。
序列化器_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.object.get(id=id)
序列化器 = playerSerializer(player_object)
except:
players = self.get_queryset()
serializer = playerSerializer(player, 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"/span>]
player_object = player.object.get(id=id)
data = request.data
player_object.first_name = data["first_name"/span>]
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"/span>]
player_object = player.object.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('player/<int:id>/', playerList.as_view())。
]
uj5u.com熱心網友回復:
我強烈建議使用DRF的viewsets,因為它將涵蓋大部分你在這里需要的東西,而且代碼很少。但是,如果你想在你當前的視圖中自己玩弄它:
首先,你必須要有自己的視圖。
首先,你必須定義另一個接受玩家ID的URL,同時保留舊的URL以保持你想要的當前行為:
urlpatterns = [
url('player/<int:pk>', playerList.as_view() )。
url('player', playerList.as_view() )。
]
players/<int:pk>將支持像players/1這樣的urls,并在視圖中把1作為關鍵字引數pk傳遞。
然后你可以把你的視圖改成這樣:
from django.shortcuts import get_object_or_404
class playerList(APIView)。
...
def get_object(self, id)
return get_object_or_404(self.get_queryset(), id=id)
def get(self, request, pk=None, *args, **kwargs) 。
id = pk or request.query_params.get('id')
if id:
serializer = playerSerializer(self.get_object(id)
else:
serializer = playerSerializer(self.get_queryset(), many=True)
return Response(serializer.data)
def post(self, request, *args, **kwargs)。
...
def put(self, request, pk=None, *args, **kwargs) 。
player_object = self.get_object(pk or request.query_params.get('id')
...
def patch(self, request, pk=None, *args, **kwargs) 。
player_object = self.get_object(pk or request.query_params.get('id')
...
id = pk or request.query_params.get('id')
這意味著,如果pk沒有被傳遞(即使用的url不是players/1),那么視圖將只是通過從request.query_params獲取id來做你的舊行為。這也是為什么pk=None被設定的原因,以防我們從查詢引數中獲取id。還要注意的是,post需要同時捕獲args和kwargs。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/332353.html
標籤:
