web-dev-qa-db-ja.com

"detail": "メソッド\" GET \ "は許可されていません。django

私は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."
}

ここで何が欠けていますか。

4
Melissa Stewart

_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")
_
7
JPG

getpostに別々のメソッドを提供する必要があります。 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)
2
Lorenzo Peña