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...
मुझे लगता है कि आप कहां आपकी क्वेरी के खंड में शामिल करने के लिए 'c1.response_id = c2.response_id' मतलब है। –
@AryehLeibTaurog हाँ मैंने किया। धन्यवाद। – Ryan