Запрос с минимальным и максимальным размером в Django rest api - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть эта модель:

class Image(models.Model):
    image_name=models.CharField(max_length=30)
    image=models.ImageField(upload_to='images',width_field='image_width', height_field='image_height',)
    image_width=models.PositiveIntegerField(null=True, blank=True, editable=False)
    image_height=models.PositiveIntegerField(null=True, blank=True, editable=False)
    image_size=models.IntegerField(null=True, blank=True,editable=False)

Вид такой:

class ImageViewSet(viewsets.ModelViewSet):
        queryset = Image.objects.all()
        serializer_class = ImageSerializer
        filter_backends = (DjangoFilterBackend, OrderingFilter,)
        filter_fields = ('image_name',)
        ordering_fields = ('id','image_name,)

Я могу сохранить изображения со всеми этими атрибутами.Я хочу получить запрос, подобный этому, чтобы вернуть все изображения с высотой больше 100 и меньше 300:

GET /images/?minheight=100&maxheight=300

Как добиться этого в Django?

Я получаю 500 серверовошибка, если я пытаюсь сделать огонь API с minheight пустым GET /images/?minheight=

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Необходимо вручную отфильтровать набор запросов на основе параметров GET.

class ImageViewSet(viewsets.ModelViewSet):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    filter_backends = (DjangoFilterBackend, OrderingFilter,)
    filter_fields = ('image_name',)
    ordering_fields = ('id','image_name,')

    def get_queryset(self):
        minheight = self.request.GET.get('minheight')
        maxheight = self.request.GET.get('maxheight')

        return self.queryset.filter(image_height__gte=minheight, image_height__lt=maxheight)
0 голосов
/ 24 декабря 2018

В общем случае запрос будет выглядеть следующим образом:

qs = models.Image.objects.filter(image_height__gt=100, image_height__lt=300)

При этом используются полевые поиски gt и lt .Существуют также варианты для больше или равно (gte) и меньше или равно (lte).

class ImageViewSet(viewsets.ModelViewSet):
    serializer_class = ImageSerializer
    filter_backends = (DjangoFilterBackend, OrderingFilter,)
    filter_fields = ('image_name',)
    ordering_fields = ('id','image_name',)

    def get_queryset(self):
        queryset = Image.objects.all()
        minheight = self.request.query_params.get('minheight', '')
        maxheight = self.request.query_params.get('maxheight', '')

        if(minheight and maxheight):
            queryset = queryset.filter(image_height__gt=minheight,
                                       image_height__lt=maxheight)
        return queryset
...