我正在移植旧的Django Piston REST API以使用Django Rest Framework。我在Django 1.7(GeoDjango)工作。
尽管我已经研究了教程和文档,但我真的很难掌握DRF。感觉就像一个超级油轮 - 非常强大,但很难理解它是如何工作的!我想做的事应该很简单。我有Django模型如下:
class County(models.Model):
id = models.CharField(max_length=3, unique=True, primary_key=True)
name = models.CharField(max_length=100)
class Place(models.Model):
id = models.IntegerField(primary_key=True)
county = models.ManyToManyField(County, related_name='places_in_county')
name = models.CharField(max_length=300)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
我有一个针对placesnear?lat=52.5&lng=1.0&radius=10
等查询的现有API调用。它仅限GET,可供任何人使用(无需权限)。
从这个调用中我需要像这样返回JSON:
[{
'id': 3725,
'county': {
'id': 7,
'name': 'Norfolk'
},
'name': 'Norwich'
}]
所以我在我的视图文件中尝试这个:
@api_view(['GET'])
def places_near(request):
renderer_classes = (JSONRenderer, )
params = request.query_params
point = Point(params['lat'], params['lng'])
places = Place.objects.filter(location__dwithin=(point.location, D(km=params['radius'])))
return Response(places)
这在我的网址文件中:
urlpatterns = [
url(r'^placesnear/$', views.places_near),
]
但是这给了我一个AssertionError:Cannot apply DjangoModelPermissions on a view that does not have .model or .queryset property.
。
这可以连接到我的设置文件中的设置(我不确定这是否正确,我想这样做,以便视图是只读的,但任何人都可以使用):
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100,
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
如何修复此错误?而且,我的视图文件中的方法是否模糊正确?
答案 0 :(得分:1)
由于您的places_near
API只能通过查看代码来清楚阅读,因此使用AllowAny
权限是安全的。您可以使用permission_classes
装饰器将此权限用于此特定视图。
from rest_framework.permissions import AllowAny
@api_view(['GET'])
@permission_classes((AllowAny, ))
def places_near(request):
然后,您可以在设置中单独决定默认应用哪些权限。选项描述为here。