私はDjango.rest_frameworkを使用しています。特定のビューのget_or_createメソッドがあります。
class LocationView(views.APIView):
def get_or_create(self, request):
try:
location = Location.objects.get(country=request.data.get("country"), city=request.data.get("city"))
Response(location, status=status.HTTP_200_OK)
except Location.DoesNotExist:
serializer = LocationSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
これはロケーションモデルです、
class Location(models.Model):
country = models.CharField(max_length=255)
city = models.CharField(max_length=255, unique=True)
latitude = models.CharField(max_length=255)
longitude = models.CharField(max_length=255)
class Meta:
unique_together = ('country', 'city')
これは私のURLです、
url(r'^location/$', LocationView.as_view(), name='location'),
このエンドポイントを次のように呼び出すと、 http://127.0.0.1:8000/api/v1/bouncer/location/?country=USA && city = Sunnyvale && latitude = 122.0363 && longitude = 37.3688
これは私が得るものです、
{
"detail": "Method \"GET\" not allowed."
}
ここで何が欠けていますか。
_Method not allowed
_エラーは、APIクラス内でget()
メソッドを検索し、見つからなかったためです。
APIクラスの一般的な形式は次のとおりです
_class LocationView(views.APIView):
def get(self, request):
#do something with 'GET' method
return Response("some data")
def post(self, request):
#do something with 'POST' method
return Response("some data")
_
ある時点でget_or_create()
メソッドを呼び出したい場合は、他のメソッドと同じように呼び出すことができます。
_class LocationView(views.APIView):
def get_or_create(self, request):
# do some "get or create" stuff
return "some data"
def get(self, request):
if condition:
self.get_or_create(request)
# do some stuff
return Response(" some special data related to get or create")
return Response("some data")
_
get
とpost
に別々のメソッドを提供する必要があります。 get
メソッドもインスタンスを作成する場合は、get
メソッドとpost
メソッドの両方で現在のget_or_create
を呼び出すことができます。
class LocationView(views.APIView):
def get_or_create(self, request):
# your current definition here
def get(self, request):
return self.get_or_create(request)
def post(self, request):
return self.get_or_create(request)