2016-08-16 3 views
0

私のapiはDjango Rest Frameworkで設定されています。私はDjangoの末尾にスラッシュを付けて戦っているように感じています。私が理解していないいくつかの組み合わせがあるようです。基本クエリは、常にAPIのエンドポイントにあるすべてのオブジェクトを返します。 ??奇妙なクエリはすべてのアイテムを返します

// App config 
var App = angular.module('App',['App.controllers','restangular','ngRoute','ngResource']); 

App.config(function ($interpolateProvider, $httpProvider, $resourceProvider, RestangularProvider) { 

    RestangularProvider.setBaseUrl('/api/'); 

    // Things I've tried 
    RestangularProvider.setBaseUrl('http://127.0.0.1:8000/api/'); 
    RestangularProvider.setRequestSuffix('/'); 
    // with suffix http://127.0.0.1:8000/api/tests/?value=404 
    // without suffix http://127.0.0.1:8000/api/tests?value=404 
    $resourceProvider.defaults.stripTrailingSlashes = false; 
}); 

// In controller 
// Items in database 
// [{"itemID": 1,"value": 5,},{"itemID": 2,"value": 404,},{"itemID": 3,"value": 73,}] 

var params = {'value': 404}; 
Restangular.all('tests').getList(params).then(function(items) { 
    var items = items 
    console.log(items) 
}); 

// Even the standard $resource does the same thing. 
var Foo = $resource('/api/tests', {value:'@somevalue'}); 
$scope.allItems = {}; 
Foo.query({value:404}, function(items) { 
    $scope.allItems = items; 
}); 

は私が/のparams

"GET /api/tests?value=404 HTTP/1.1" 301 0 
"GET /api/tests/?value=404 HTTP/1.1" 200 361 

たぶん私は構造化テストにかけて/それに行くしようとしているテストのparamsそれ障害を見ることができます:ここで

コードです間違ったクエリ?実際に住所に行くことによってクエリをテストする方法はありますか?技術的にはhttp://127.0.0.1:8000/api/tests?value=404に移動しないでください。値が404のオブジェクトのリストだけがDRFに表示されますか? DRFはパラメータの前のURLの最後にスラッシュを入れます(http://127.0.0.1:8000/api/tests/?value=404)。

誰かがDjango Rest Frameworkで作業するための試行錯誤した方法がありますか?

+0

実際に私たちはDRFコード、特にurls.pyとviews.pyを見る必要があります – pleasedontbelong

答えて

0

ここで私が理解したことがあります。クエリにはDjango Rest Framework filteringが必要です。 djangoフィルタをインストールした後、filter_backendsとfilter_fieldsをビューセットに追加します。行ってもいい。

$ pip install django-filter 

// In your serializers.py 
// Create your serializer 
from rest_framework import serializers 
class FoobarSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Foobar 
     fields = ('foo','bar') 


// ----- 
// In your main app urls.py (or wherever you put your viewset, I have them in urls so most api stuff is collected there) 
from rest_framework import routers 
from rest_framework import viewsets 
from rest_framework import filters 
from mainapp.serializers import FoobarSerializer 
from app.models import Foobar 


// Put your filter fields in your viewset 
class FoobarViewSet(viewsets.ModelViewSet): 
    queryset = Foobar.objects.all() 
    serializer_class = FoobarSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_fields = ('foo', 'bar') 

// Register the viewset 
router = routers.DefaultRouter() 
router.register(r'foobars', FoobarViewSet) 
urlpatterns = [ 
    ... 
    url(r'^api/', include(router.urls)), 
] 

// ----- 
// In your angular controller.js 
// Restangular 
var params = {'foo': 404}; 
Restangular.all('foobars').getList(params).then(function(items) { 
    $scope.items = items 
}); 

// $resource 
var Foo = $resource('/api/foobars', {value:'@somevalue'}); 
Foo.query({value:404}, function(items) { 
    $scope.items = items; 
}); 

// $http 
$http({method:'GET',url:'/api/foobars',params:{value:404}}).then(function(response) { 
    $scope.items = response.data; 
}); 
関連する問題