我正在使用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(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."
}
我在这里缺少什么。
答案 0 :(得分:8)
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")
答案 1 :(得分:2)
您需要为get
和post
提供单独的方法。如果您的get
方法也创建了一个实例,那么您只需在get_or_create
和get
方法中调用当前的post
。
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 :(得分:0)
对于我的情况,我按照我的预期正确发送了一个请求,一个 POST
。但问题出在 http/s
上。我在我的应用程序上设置了从 http
到 https
的永久重定向,因此向 POST
版本发送 http
以某种方式导致 GET
服务器正在重定向。
TL;DR
HTTP 而不是 HTTPS