2013-05-11 8 views
6

मैं एक Django मॉडल है कि कुछ इस तरह दिखता है मानों की तुलना कोडर 4 के लिए। मैं जो करने में सक्षम होना चाहता हूं वह सभी प्रतिक्रिया ऑब्जेक्ट्स की एक सूची प्राप्त करता है जिसके लिए कोडर 3 और कोडर 4 के बीच मूल्य में अंतर 1 से अधिक है। मान फ़ील्ड नंबर 1-7 स्टोर करता है।Django दो वस्तुओं

मुझे लगता है कि एक चरखी के रूप में मूल्य स्थापित करने की गलती हो सकती है, लेकिन उम्मीद है कि मैं इसके आसपास हो सकता हूं।

मेरा मानना ​​है कि निम्नलिखित एसक्यूएल की तरह कुछ मैं के लिए क्या देख रहा हूँ क्या करना होगा, लेकिन मैं नहीं बल्कि आप क्वेरी में पहले से ही एक मेज पर में शामिल होते हैं ORM

SELECT UNIQUE c1.response_id FROM coding c1, coding c2 
WHERE c1.coder_id = 3 AND 
     c2.coder_id = 4 AND 
     c1.qid = "risk" AND 
     c2.qid = "risk" AND 
     c1.response_id = c2.response_id AND 
     c1.value - c2.value > 1 
+1

मुझे लगता है कि आप कहां आपकी क्वेरी के खंड में शामिल करने के लिए 'c1.response_id = c2.response_id' मतलब है। –

+0

@AryehLeibTaurog हाँ मैंने किया। धन्यवाद। – Ryan

उत्तर

2
from django.db.models import F 
qset = Coding.objects.filter(response__coding__value__gt=F('value') + 1, 
          qid='risk', coder=4 
        ).extra(where=['T3.qid = %s', 'T3.coder_id = %s'], 
          params=['risk', 3]) 
responses = [c.response for c in qset.select_related('response')] 

के साथ ऐसा होता है , ओआरएम दूसरे मामले को उपनाम देगा, इस मामले में टी 3, जिसे आप पैरामीटर में extra() पर उपयोग कर सकते हैं। यह जानने के लिए कि उपनाम क्या है, आप खोल में और print qset.query में जा सकते हैं।

F objects पर

Django देखें प्रलेखन और extra

अद्यतन: ऐसा लगता है कि आप वास्तव में, extra() उपयोग करें, या यह पता लगाने क्या उर्फ ​​का उपयोग करता है django की जरूरत नहीं है, क्योंकि हर बार जब आप अपने लुकअप में response__coding को देखें, django प्रारंभ में बनाए गए उपनाम का उपयोग करेगा। यहाँ एक तरह से किसी भी दिशा में अंतर के लिए देखने के लिए है: BTW Q objects

पर

from django.db.models import Q, F 
gt = Q(response__coding__value__gt=F('value') + 1) 
lt = Q(response__coding__value__lt=F('value') - 1) 
match = Q(response__coding__qid='risk', response__coding__coder=4) 
qset = Coding.objects.filter(match & (gt | lt), qid='risk', coder=3) 
responses = [c.response for c in qset.select_related('response')] 

Django देखें प्रलेखन, आप दोनों कोडिंग उदाहरणों चाहते करने जा रहे हैं, तो आप एक एन 1 प्रश्नों समस्या यहाँ है, क्योंकि django के select_related() रिवर्स एफके रिश्तों को नहीं मिलेगा। लेकिन चूंकि आपके पास पहले से ही क्वेरी में डेटा है, इसलिए आप ऊपर वर्णित T3 उपनाम का उपयोग करके आवश्यक जानकारी पुनर्प्राप्त कर सकते हैं और extra(select={'other_value':'T3.value'})। संबंधित कोडिंग रिकॉर्ड से value डेटा पुनर्प्राप्त कोडिंग उदाहरण पर एक विशेषता के रूप में सुलभ होगा, यानी c.other_value के रूप में।

संयोग से, आपका प्रश्न सामान्य है, लेकिन ऐसा लगता है कि आपके पास एक इकाई-विशेषता-मूल्य स्कीमा है, जो एक आरडीबी परिदृश्य में आम तौर पर एक विरोधी पैटर्न माना जाता है। आप एक risk क्षेत्र के साथ बेहतर लंबी अवधि के हो सकता है (और इस क्वेरी सरल हो जाएगा):

class Coding(models.Model): 
    response = models.ForeignKey(Response) 
    coder = models.ForeignKey(User) 
    risk = models.IntegerField() 
    # other fields for other qid 'attribute' names... 
+0

यह बहुत अच्छा है। क्या यह काम करने के लिए कोई तरीका है कि कोडर 3 या कोडर 4 अधिक है या नहीं? – Ryan

+2

मैंने एक समाधान के साथ उत्तर अद्यतन किया जो दोनों मामलों के लिए काम करता है। –

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