2014-10-30 68 views
0

我与Django的REST的架构工作,我有一个返回我的信息与这样的过滤器的API:Django的API REST返回的所有对象模型中的

http://example.com/api/products?category=clothing&in_stock=True 
--this returns me 10 items 

但它也返回整个模型数据,如果我不把过滤器,这是默认的方式。

http://example.com/api/products/ 
--this returns me more than 100 (all the Model Table) 

我该如何禁用这个默认操作,我的意思是,我怎样才能使过滤器是必要的,使这个api的作品?甚至更好!我怎样才能让最后一个URL返回一个空的JSON响应?

UPDATE 下面是一些代码:

serializers.py

class OEntradaDetalleSerializer(serializers.HyperlinkedModelSerializer): 
    item = serializers.RelatedField(source='producto.item') 
    descripcion = serializers.RelatedField(source='producto.descripcion') 
    unidad = serializers.RelatedField(source='producto.unidad') 
    class Meta: 
     model = OEntradaDetalle 
     fields = ('url','item','descripcion','unidad','cantidad_ordenada','cantidad_recibida','epc') 

views.py

class OEntradaDetalleViewSet(BulkUpdateModelMixin,viewsets.ModelViewSet): 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_fields = ('cantidad_ordenada','cantidad_recibida','oentrada__codigo_proveedor','oentrada__folio') 
    queryset = OEntradaDetalle.objects.all() 
    serializer_class = OEntradaDetalleSerializer 

urls.py

router2 = BulkUpdateRouter() 
router2.register(r'oentradadetalle', OEntradaDetalleViewSet) 

urlpatterns = patterns('', 
url(r'^api/',include(router2.urls)), 
) 

网址范例

http://localhost:8000/api/oentradadetalle/?oentrada__folio=E01 
THIS RETURNS ONLY SOME FILTERED VALUES 

http://localhost:8000/api/oentradadetalle/ 
THIS RETURNS EVERYTHING IN THE MODEL (I need to remove this or make it return some empty data) 
+0

请给一些代码。 – 2014-10-30 21:43:16

+0

我不知道为什么你需要一些代码,它有默认的API行为,我需要重写它。无论如何...有我自己的代码更新,我希望你能帮助我。谢谢 – 2014-10-30 22:28:19

回答

1

我会强烈建议using pagination,以防止任何人能够返回所有的结果(这可能需要一段时间)。

如果您可以节省额外的查询时间,您可以随时检查过滤和未过滤的查询集是否匹配,并且只要返回空的查询集就行(如果情况如此)。这将在您的视图中的filter_queryset方法中完成。

def filter_queryset(self, queryset): 
    filtered_queryset = super(ViewSet, self).filter_queryset(queryset) 

    if queryset.count() === len(filtered_queryset): 
     return queryset.model.objects.none() 

    return filtered_queryset 

这将使原来的查询集的计数一个额外的查询,如果是一样的过滤查询集,一个空的查询集将被退回。如果查询集实际上被过滤了,它将被返回,结果将成为你所期望的。

+0

这正是我需要的! 你是杰出的@凯文布朗。非常感谢! – 2014-10-30 22:35:34

+0

我在这里有一个奇怪的情况...这与过滤器中的两个或多个对象一起工作,我的意思是,我正在过滤oentrada__folio字段,但如果我只有一个,这不起作用,因为queryset始终等于filtered_queryset,我怎样才能使这个东西适用于一个条目?我可以做一个查询来计算ocompra__folio的数量,如果它是1,然后返回给我的查询集,但是有另一种方法,不做另一个查询? – 2014-10-31 15:22:06

相关问题