2016-04-15 24 views
5

मैं है निम्नलिखित Django मॉडल है कि JSONField शामिल हैं:Django 1.9 JSONField order_by

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

    class Meta: 
     verbose_name_plural = 'Ratebook data entries' 

और डेटा क्षेत्र इस json शामिल हैं:

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

मैं इन सबसे क्वेरीसमूह डेटा क्षेत्रों में से एक से कर सकते हैं ? यह क्वेरी काम नहीं करती है।

RatebookDataEntry.objects.all().order_by("data__manufacturer_name") 
+1

ऐसा नहीं है कि मुझे (एक क्वेरीसेट पर) पता है, लेकिन इस तरह का मुझे इंगित करता है कि आपको वास्तव में जेसन – Sayse

+4

के बजाय "डेटा" के लिए ऑब्जेक्ट मॉडल की आवश्यकता हो सकती है, इसके बजाय 'डिफ़ॉल्ट = सूची'' डिफ़ॉल्ट = [] ', अन्यथा आप अलग-अलग उदाहरणों के बीच साझा की गई एक ही सूची के साथ समाप्त हो जाएंगे। – Alasdair

उत्तर

16

जैसा कि जूलियन ने JSONField पर ऑर्डरिंग का उल्लेख किया है, अभी तक Django में समर्थित नहीं है। लेकिन RawSQL के माध्यम से PostgreSQL functions for jsonb का उपयोग कर यह संभव है। ओपी के मामले में:

from django.db.models.expressions import RawSQL 
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("manufacturer_name",))) 
+4

और यदि आप डीईएससी ऑर्डरिंग चाहते हैं, तो आप इसके द्वारा एनोटेटेड फ़ील्ड और ऑर्डर पेश कर सकते हैं। इस तरह: RatebookDataEntry.objects.annotate (निर्माता_नाम = RawSQL ("डेटा - >>% s", ("निर्माता_नाम",))। Order_by ("- निर्माता_नाम") –

+0

बस अगर कोई केवल स्वीकार्य उत्तर को देख रहा है, यह Django 2.1 में एक विशेषता है, लिंक के लिए मेरा जवाब देखें। – yekta

0

प्रलेखन इस संभावना का उल्लेख नहीं करता है। ऐसा लगता है कि आप इस समय के लिए JSONfield के आधार पर order_by का उपयोग नहीं कर सकते हैं।

+0

हां। मुझे दस्तावेज़ों में ऑर्डर करने के बारे में कोई भी उल्लेख नहीं मिला। –

4

Daniil Ryzhkov जवाब और Eugene Prikazchikov टिप्पणी के बाद, आप अपने क्वेरीसमूह व्याख्या के बिना JSON डेटा खेतों पर एएससी और DESC सॉर्ट करने के लिए, RawSQL और OrderBy दोनों का उपयोग करके सक्षम होना चाहिए। इसके अलावा, आप LOWER जोड़कर केस संवेदी छंटाई कर सकते हैं:

from django.db.models.expressions import RawSQL, OrderBy 

RatebookDataEntry.objects.all().order_by(OrderBy(RawSQL("LOWER(data->>%s)", ("manufacturer_name",)), descending=True)) 

पूर्णांकों क्षेत्रों की तुलना करने के लिए, आप पूर्णांक के रूप में कास्ट कर सकते हैं:

RatebookDataEntry.objects.all().order_by(OrderBy(RawSQL("cast(data->>%s as integer)", ("annual_mileage",)), descending=True)) 
संबंधित मुद्दे