2011-10-26 17 views
8

ERRDjango ORM का चयन करें Django में

मॉडल में शामिल होने के साथ:

NAME (from record) 
and fields related with this record 
[NAME (from key), VALUE (from value)] 
[NAME (from key), VALUE (from value)] 
[...] 

मैं Django ORM इस चयन बनाने के लिए उपयोग कर सकते हैं:

class Key(models.Model): 
    id  = models.AutoField(primary_key=True, blank=True) 
    name = models.CharField(max_length=50) 


class Record(models.Model): 
    id   = models.AutoField(primary_key=True, blank=True) 
    project_id = models.IntegerField() 
    name  = models.CharField(max_length=50) 


class Value(models.Model): 
    id  = models.AutoField(primary_key=True, blank=True) 
    record = models.ForeignKey(Record) 
    key  = models.ForeignKey(Key) 
    value  = models.CharField(max_length=255) 

मैं डीबी से इस डेटा का चयन करने की जरूरत है? (उदाहरण के लिए एसक्यूएल में इस तरह दिखता है)

SELECT 
    `keeper_record`.`id` AS `record_id`, 
    `keeper_record`.`name` AS `name`, 
    `keeper_record`.`desc` AS `desc`, 
    `keeper_key`.`name` AS `key_name`, 
    `keeper_key`.`desc` AS `key_desc`, 
    `keeper_value`.`value` AS `value_value` 
FROM `keeper_record` 
JOIN `keeper_value` ON `keeper_record`.`id` = `keeper_value`.`record_id` 
JOIN `keeper_key` ON `keeper_key`.`id` = `keeper_value`.`key_id` 
WHERE record_id = id 

उत्तर

7

निम्नलिखित विशेष रिकॉर्ड आईडी से संबंधित मानों का चयन करता है। फिर आप संबंधित रिकॉर्ड और कुंजी प्राप्त करने के लिए विदेशी कुंजी का पालन कर सकते हैं। select_related का उपयोग डेटाबेस लुकअप को कम करता है।

# Select all values related to a record in your view 
record = Record.objects.get(pk=record_id) 
values = Value.objects.filter(record=record).select_related() 

# In your template 
{% for value in values %} 
{{ value.record.name }} - {{ value.key.name }} - {{ value.value }} 
{% endfor %} 

अधिक है कि एक रिकॉर्ड

अपने एसक्यूएल में चयन, आप WHERE record_id = 1 थी, इसलिए मैं किसी खास रिकॉर्ड के लिए सभी मूल्यों को प्राप्त करने के लिए कैसे पता चला है। आप एक प्रश्न में एक रिकॉर्ड के लिए मूल्यों का चयन भी कर सकते हैं।

# filter all records which belong to the project with `project_id=1` 
records = Record.objects.filter(project_id=1) 
# select all values that belong to these records 
values = Value.objects.filter(record__in=records).select_related().order_by('record') 
+0

मैंने सही ढंग से समझा है कि प्रत्येक रिकॉर्ड के लिए मूल्यों का चयन करने के लिए एक अतिरिक्त क्वेरी की आवश्यकता होती है, और यदि मैं सभी (या कुछ) रिकॉर्ड चुनना चाहता हूं तो मुझे लूप में मूल्यों का चयन करने की आवश्यकता है? – Deadly

+2

मैंने एक से अधिक रिकॉर्ड चुनने के लिए उत्तर अपडेट किया है। आशा करता हूँ की ये काम करेगा। – Alasdair

+0

हाँ, यह वास्तव में मुझे django ORM समझने में मदद मिली है, धन्यवाद। – Deadly

2

अपेक्षाकृत सीधा होना चाहिए, क्योंकि आपके पास पहले से ही विदेशी कुंजी एक साथ बंधी हुई हैं।

Record.objects.select_related().filter(id = variable_that_stores_id) 

आप को जोड़ सकते हैं कि only साथ क्षेत्रों है कि आप वापस लाना चाहते हैं सीमित करने के लिए।

+0

'select_related' यहां काम नहीं करेगा, क्योंकि यह विदेशी कुंजी 'पिछड़ा' का पालन नहीं करता है। – Alasdair

+0

मैं देखता हूं। ऐसा प्रतीत होता है कि मेरी पोस्ट के बाद से सवाल थोड़ा सा बदल गया है, लेकिन भले ही यह गलत या अपूर्ण था। – Jordan

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