2016-11-16 28 views
7

मैं एक JSONField कक्षा के भीतर दो मानों की तुलना करके एक Django क्वेरी बनाने की उम्मीद कर रहा हूं। मैं मॉडल पर संदर्भ फ़ील्ड के लिए Django F() ऑब्जेक्ट्स में भाग गया, लेकिन यह JSONField के साथ काम नहीं करता है क्योंकि यह बाद के खंड के साथ JOIN करने का प्रयास करता है। तो, उदाहरण के लिए:Django, JSONField, Postgres, और F() ऑब्जेक्ट तुलना

{ 
    "value_1":20, 
    "value_2":25 
} 

मैं ऐसे है जैसे कि यह क्वेरी करने के लिए उम्मीद कर रहा था:

events = Event.objects.filter(data__value_2__gte=F('data__value_1')) 

हालांकि, त्रुटि है

class Event(models.Model): 
    data = JSONField(default=None) 

मान डेटा फ़ील्ड कुछ इस तरह दिखता चलो इस तरह कुछ:

Cannot resolve keyword 'value_1' into field. Join on 'data' not permitted. 

इसके अलावा कोशिश की है:

events = Event.objects.filter(data__value_2__gte=F('data')['value_1']) 

लेकिन त्रुटि दिया हूँ:

TypeError: 'F' object has no attribute '__getitem__' 

इसके अलावा, Django 1.10, पायथन 2.7.11, पीजी संस्करण: 9.4.9

किसी भी विचार को value_1 और value_2 की तुलना के आधार पर फ़िल्टर करने का कोई विचार है?

+0

यह सिर्फ एक अनुमान है, लेकिन 'data__value_2__gte = F ('data') ['value_1'] 'आज़माएं। –

+0

काम नहीं किया: TypeError: 'F' ऑब्जेक्ट में कोई विशेषता नहीं है '__getitem__' – dperconti

+0

Django 1.10, पायथन 2.7.11 – dperconti

उत्तर

2

जिस तरह से दिखता है, यह कहा जा सकता है कि एफ अभिव्यक्ति जेसन फील्ड लुकअप का समर्थन नहीं करती है। आप Django क्वेरी के नीचे के लिए उत्पन्न

print Event.objects.filter(data__value_1=F('data')).query 
SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= ("test_event"."data") 

इस के लिए आदेश में एसक्यूएल क्वेरी नीचे देखें postgres पर काम कर सकते हैं के रूप में, क्वेरी के नीचे होना चाहिए:

SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= "test_event"."data" -> 'value_2' 

तुम जो भी एफ अभिव्यक्ति के साथ प्रयास करते हैं, यह अभिव्यक्ति के लिए प्रारूप "test_mymodal"."data" -> 'value_2' उत्पन्न नहीं करता है।

+0

मैंने अपने डेटा संरचनाओं को फिर से मॉडलिंग करना समाप्त कर दिया ताकि मैं एफ ऑब्जेक्ट्स का उपयोग कर सकूं। भले ही, यह एक सही स्पष्टीकरण और कामकाज प्रतीत होता है, हालांकि, मैंने परीक्षण नहीं किया है। – dperconti

संबंधित मुद्दे