2014-11-28 8 views
8

मेरे पास एक Django ऐप है जहां मेरे मुख्य मॉडल में अन्य डीबी टेबलों के लिए विदेशीकी फ़ील्ड हैं।Django: object.values ​​() का उपयोग करके और टेम्पलेट में विदेशीकी डेटा प्राप्त करें

class Bugs(models.Model): 
    bug_id = models.PositiveIntegerField(primary_key=True) 
    bug_severity = models.ForeignKey(Bug_severity,null=True) 
    priority = models.ForeignKey(Priority,null=True) 
    bug_status = models.ForeignKey(Bug_Status,null=True) 
    resolution = models.ForeignKey(Resolution,null=True) 
    etc... 

सभी विदेशीकी टेबलों में एक यूनिकोड फ़ंक्शन होता है जो उस टेम्पलेट में प्रदर्शित होने वाला नाम देता है।

class Priority(models.Model): 
    value = models.CharField(max_length=64) 
    sortkey = models.PositiveSmallIntegerField() 
    isactive = models.NullBooleanField() 
    visibility_value_id = models.SmallIntegerField(null=True,blank=True) 

    def __unicode__(self): 
     return self.value 

ध्यान में रखते हुए, मैं के रूप में क्वेरी चला रहा हूँ:

bugs = Bugs.objects.filter(active=True).order_by('priority__sortkey','bug_severity__sortke 

टेम्पलेट में, मैं उन के माध्यम से पुनरावृति, और ForeignKey मूल्य सही ढंग से प्रदर्शित कर सकते हैं।

{% for bug in bugs %} 
    <tr class="bugrow" > 
    <td>{{bug.bug_id}}</td> 
    <td>{{bug.priority}}</td> 
    <td>{{bug.bug_severity}}</td> 
    <td>{{bug.bug_status}}</td> 
    <td>{{bug.resolution}}</td> 

समस्या मैं कर रहा हूँ कि मैं इसे टेम्पलेट को भेजने से पहले बग डेटा में हेरफेर करने की जरूरत है, इसलिए मैं() विधि मूल्यों का उपयोग एक शब्दकोश लौटने के लिए। जब मैं उस शब्दकोश को टेम्पलेट में पास करता हूं तो यह किसी भी फ़ील्ड को नहीं दिखाता जो कि विदेशीकी को इंगित करता है।

मुझे पूरा यकीन है कि कारण यह है कि मान केवल वास्तविक डेटाबेस मान लौटाते हैं, इसलिए यह एफके का पालन नहीं कर सकता है।

सवाल यह है कि, मैं इसे टेम्पलेट में भेजने वाले डेटा में कैसे उपयोग कर सकता हूं, और फिर भी विदेशीकी का पालन करता हूं?

उत्तर

14

मैं इस विधि का हर समय उपयोग करता हूं। तुम सही हो। यह केवल मान देता है, इसलिए आपको विदेशी कुंजी से मूल्य प्राप्त करने के लिए "__" नोटेशन का उपयोग करना होगा। उदाहरण के लिए:

# Get all of the bugs 
bugs = Bugs.objects.filter(
    active=True, 
).order_by(
    'priority__sortkey', 
    'bug_severity__sortkey', 
).values(
    'bug_id', 
    'priority', # Only the pk (id) of the bug priority FK 
    'priority__value', # Equal to bug.priority.value 
    'bug_severity', 
    'bug_severity__some_value', # Equal to bug.priority.some_value 
) 

अब, अपने टेम्पलेट में, है न:

तुम भी पर क्षेत्रों का उल्लेख कर सकते हैं:

{% for bug in bugs %} 
    <tr class="bugrow"> 
     <td>{{ bug.bug_id }}</td> 
     <td>{{ bug.priority }}</td> 
     <td>{{ bug.priority__value }}</td> 
     <td>{{ bug.bug_severity }}</td> 
     <td>{{ bug.bug_severity__some_value }}</td> 
    </tr> 
{% endfor %} 

इस तल के पास QuerySet.values() documentation में कवर किया जाता है, रिवर्स रिश्तों के साथ संबंधित मॉडल वनटोनफिल्ड, विदेशीकी और कई टोमनीफिल्ड गुणों के माध्यम से:

Blog.objects.values('name', 'entry__headline') 
[{'name': 'My blog', 'entry__headline': 'An entry'}, 
{'name': 'My blog', 'entry__headline': 'Another entry'}, ...] 
+1

यह पूरी तरह से काम किया। मैं कसम खाता हूं कि मैंने Queryset.values ​​() दस्तावेज को 10 बार समझने की कोशिश की और एफके संबंधों के बारे में उस निचले ब्लॉक को कभी नहीं पढ़ा। – zoidberg

+1

बुरा मत समझो - मैंने पहली बार याद किया जब मैंने कई बार याद किया। मैं व्यक्तिगत रूप से सोचता हूं कि दस्तावेज़ीकरण का एक विशेष टुकड़ा होना चाहिए, न कि बाद में विचार। –

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