我正在使用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)
答案 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
这将对原始查询集的计数进行一次额外查询,如果它与筛选的查询集相同,则将返回空的查询集。如果实际过滤了查询集,则会返回该查询集,结果将是您所期望的结果。