基本的django-rest-framework:如何开始编写视图?

时间:2015-04-05 22:18:27

标签: python django django-rest-framework

我正在移植旧的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'
    ]
}

如何修复此错误?而且,我的视图文件中的方法是否模糊正确?

1 个答案:

答案 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