Restangular查询返回所有项目
问题描述:
我的api使用Django Rest Framework进行设置,我觉得我正在用Django尾随斜线进行操作。似乎有一些我没有想到的组合。基本查询总是返回api端点上的所有对象。Restangular查询返回所有项目
下面的代码:
// 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,但故障到测试/ PARAMS
"GET /api/tests?value=404 HTTP/1.1" 301 0
"GET /api/tests/?value=404 HTTP/1.1" 200 361
也许我是结构?查询错误?有没有办法通过实际地址来测试查询?从技术上讲,不应该导航到http://127.0.0.1:8000/api/tests?value=404在DRF中只显示值为404的对象列表? DRF在参数(http://127.0.0.1:8000/api/tests/?value=404)之前的url末尾输入斜杠。
有没有人有尝试过的方法来处理Django Rest Framework?
答
这是我想出来的。查询需要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;
});
实际上我们需要看到DRF代码,特别是urls.py和views.py – pleasedontbelong