2015-04-05 51 views
1

我正在移植一箇舊的Django Piston REST API來使用Django Rest Framework。我在Django 1.7(GeoDjango)工作。基本的django-rest-framework:如何開始寫視圖?

雖然我已經學習了教程和文檔,但我真的很努力去學習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() 

而且我有一個現有的API調用像placesnear?lat=52.5&lng=1.0&radius=10查詢。它是僅限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

由於您的places_near API只能通過查看代碼清楚地閱讀,因此使用AllowAny權限是安全的。您可以通過使用permission_classes修飾器來爲該特定視圖使用該權限。

from rest_framework.permissions import AllowAny 

@api_view(['GET']) 
@permission_classes((AllowAny,)) 
def places_near(request): 

然後,您可以單獨決定在設置中默認應用哪些權限。選項描述爲here

相關問題