在 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查询进行分页的最佳方法是什么?
使用 Rest API 编写复杂查询的 Django ORM