在 Django rest api 中查询最小和最大大小

Posted

技术标签:

【中文标题】在 Django rest api 中查询最小和最大大小【英文标题】:Query with min and max size in Django rest api 【发布时间】:2019-05-23 16:27:17 【问题描述】:

我有这个模型:

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 中实现这一点?

如果我尝试在 minheight 为空的情况下触发 api,我会收到 500 服务器错误 GET /images/?minheight=

【问题讨论】:

您能分享一下您当前观点的(相关部分)吗? 我已经更新了问题本身的视图 【参考方案1】:

一般来说,查询应该是这样的:

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

【讨论】:

我需要在哪里指定这个查询?在模型或视图中 如果您希望它成为默认值,只需替换您的查询集参数。如果您希望自定义查询参数,请参阅the docs,了解如何管理查询参数。 不,我希望 minheight 和 maxheight 参数是可选的。我不明白如何将这些参数链接到 lt/gt 查找。 我添加了一个例子。 /images/?minheight= 如果我给 minheight= 空值,我会收到 (500) 服务器错误【参考方案2】:

您必须根据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)

【讨论】:

这是正确的想法,但您需要验证 minheight 和 maxheight 不是 None。

以上是关于在 Django rest api 中查询最小和最大大小的主要内容,如果未能解决你的问题,请参考以下文章

在Django REST List API视图中对原始SQL查询进行分页的最佳方法是什么?

如何使用 Django Rest 过滤器限制查询结果

Django 和 Restful API

使用 Rest API 编写复杂查询的 Django ORM

如何使用 django rest 框架从 GET 请求的查询参数中过滤多个 id?

Django Rest Framework sql 字符串查询