2016-08-16 3 views
0

Meine API ist mit Django Rest Framework eingerichtet und ich fühle mich wie ich mit Django Trailing Schrägstriche kämpfen. Es scheint eine Kombination zu geben, die ich nicht herausgefunden habe. Eine Basisabfrage gibt immer alle Objekte am api-Endpunkt zurück.Restanguläre Abfrage gibt alle Elemente zurück

Hier ist der Code:

// 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; 
}); 

Ich kann es/Tests zu gehen sehen versuchen params aber es Fehler über Tests/params

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

Vielleicht bin ich Strukturierung? die Abfrage falsch? Gibt es eine Möglichkeit, Abfragen zu testen, indem Sie tatsächlich zur Adresse gehen? Technisch sollte nicht zu http://127.0.0.1:8000/api/tests?value=404 navigieren in DRF nur die Liste der Objekte mit einem Wert von 404 heraufbringen? DRF setzt den Schrägstrich am Ende der URL vor den Parametern (http://127.0.0.1:8000/api/tests/?value=404).

Hat jemand eine bewährte Methode für die Arbeit mit Django Rest Framework?

+0

eigentlich müssen wir den DRF-Code sehen, speziell urls.py und views.py – pleasedontbelong

Antwort

0

Hier ist, was ich herausgefunden habe. Abfrage erfordert Django Rest Framework filtering. Nach der Installation des Django-Filters fügen Sie filter_backends und filter_fields zu Ihrem Viewset hinzu. Gut zu gehen.

$ 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; 
}); 
Verwandte Themen