Django API REST返回模型中的所有对象

时间:2014-10-30 19:11:20

标签: django django-rest-framework

我正在使用django-rest-framework,我有一个API,它使用这样的过滤器返回信息:

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)

如何禁用此默认操作,我的意思是,如何使过滤器成为必需的?甚至更好!如何让最后一个URL返回空的json响应?

更新 这是一些代码:

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)

1 个答案:

答案 0 :(得分:2)

我强烈推荐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

这将对原始查询集的计数进行一次额外查询,如果它与筛选的查询集相同,则将返回空的查询集。如果实际过滤了查询集,则会返回该查询集,结果将是您所期望的结果。