django使用orm进行JsonField字段查询

我们首先看django的模型类

class RatebookDataEntry(models.Model):
    data = JSONField(blank=True, default=[])
    last_update = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = 'Ratebook data entries'

data字段包含

{
    "annual_mileage": 15000, 
    "description": "LEON DIESEL SPORT COUPE", 
    "body_style": "Coupe", 
    "range_name": "LEON", 
    "co2_gkm_max": 122, 
    "manufacturer_name": "SEAT"
}

我们向对此字段的annual_mileage进行排序,我们看下sql语句是如何做的(我们采用的数据库是pg postgresql)
排序

SELECT *,ext->'$.maxNum' AS maxNum FROM prop_info WHERE 1=1 ORDER BY maxNum DESC

可以使用KeyTextTransform 进行查询

from django.contrib.postgres.fields.jsonb import KeyTextTransform

qs = RatebookEntry.objects.all()
qs = qs.annotate(annual=KeyTextTransform('annual_mileage', 'data'))
qs = qs.order_by('annual')
# or...
qs = qs.order_by('-annual')

我们看到我们是将字段进行重命名了,所以直接按照排序就好,我使用的是2.0版本的annotate最好是 重命名一下否则会报出error

此博客是我在开发过程中遇到了这样的问题找了很多的相关网站,最后在stackoverflow一条评论中找到的
https://stackoverflow.com/questions/36641759/django-1-9-jsonfield-order-by
转发必须附带本文链接和stackoverflow链接哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值