【问题标题】:Restangular query returns all itemsRestangular查询返回所有项目
【发布时间】:2016-12-23 03:02:07
【问题描述】:

我的 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;
});

我可以看到它试图转到 /tests?params 但它会出错到 tests/?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 在 url 末尾的参数前面加上斜杠 (http://127.0.0.1:8000/api/tests/?value=404)。

有没有人尝试过使用 Django Rest Framework 的真实方法?

【问题讨论】:

  • 其实我们需要看DRF代码,特别是urls.py和views.py

标签: angularjs django django-rest-framework restangular


【解决方案1】:

这就是我想出来的。查询需要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;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2013-08-29
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    相关资源
    最近更新 更多