Django API REST возвращает все объекты в модели

Я работаю с 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)

Как я могу отключить эту операцию по умолчанию, я имею в виду, как я могу сделать фильтр необходимым для работы этого API? или даже лучше! как я могу сделать так, чтобы последний URL-адрес возвращал пустой ответ json?

ОБНОВЛЕНИЕ Вот код:

сериализаторы.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)),
)

ПРИМЕР URL

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)

person Alex Lord Mordor    schedule 30.10.2014    source источник
comment
пожалуйста, дайте код.   -  person Hasan Ramezani    schedule 31.10.2014
comment
Я не знаю, зачем вам какой-то код, у него поведение API по умолчанию, и мне нужно его переопределить. В любом случае... есть обновление с моим собственным кодом, надеюсь, вы мне поможете. Спасибо   -  person Alex Lord Mordor    schedule 31.10.2014


Ответы (1)


Я настоятельно рекомендую разбиение на страницы, чтобы никто не мог вернуться все результаты (что, вероятно, займет некоторое время).

Если вы можете избежать дополнительных запросов, вы всегда можете проверить, совпадают ли отфильтрованные и неотфильтрованные наборы запросов, и просто вернуть пустой набор запросов, если это так. Это будет сделано в методе 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

Это сделает один дополнительный запрос для количества исходного набора запросов, и если он совпадает с отфильтрованным набором запросов, будет возвращен пустой набор запросов. Если набор запросов действительно был отфильтрован, он будет возвращен, и результаты будут такими, как вы ожидаете.

person Kevin Brown    schedule 30.10.2014
comment
Это именно то, что мне было нужно!! Ты великолепен @Kevin Brown. Большое спасибо! - person Alex Lord Mordor; 31.10.2014
comment
У меня здесь странная ситуация... это работает с двумя или более объектами в фильтре, я имею в виду, что я фильтрую по полю oentrada__folio, но если у меня есть только один, это не работает, потому что набор запросов всегда равен filtered_queryset, как я могу заставить эту штуку работать с одной записью? Я могу сделать запрос для подсчета количества ocompra__folio, и если оно равно 1, то возвращает мне набор запросов, но есть ли другой метод, который не делает другой запрос? - person Alex Lord Mordor; 31.10.2014