2014-11-28 16 views
8

Ana Modelimin diğer DB tablolarına ForeignKey alanlarının bulunduğu bir Django uygulamasına sahibim. Django: objects.values ​​() işlevini kullanın ve şablonda ForeignKey verilerini alın

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... 

ForeignKey tabloları tamamı

ben şablonda görüntülenmesini istediğiniz ismi döndüren bir unicode fonksiyonu var. görünümünde
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 

, ben sorguyu çalıştırıyorum: şablonunda

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

, ben onlar aracılığıyla yineleme ve doğru olarak ForeignKey değeri görüntüleyebilir.

{% 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> 

ben yaşıyorum sorun ben şablona göndermeden önce Böcek verileri işlemek için gereken, bu yüzden bir sözlük dönmek için() yöntemini değerlerini kullanır. Bu sözlüğü şablona aktardığımda, bir ForeignKey'e işaret eden herhangi bir alan göstermez.

Bunun nedeni, değerlerin yalnızca gerçek veritabanı değerini döndürmesidir, bu yüzden FK'yi takip edemediğinden eminim.

Soru şu ki, onu şablona gönderen verileri nasıl değiştirebilirim ve yine de ForeignKey'i takip edebilirim?

cevap

14

Bu yöntemi her zaman kullanıyorum. Haklısın. Sadece değerleri döndürür, bu yüzden ForeignKey'den değer elde etmek için "__" gösterimini kullanmanız gerekir. Örneğin:

# 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 
) 

Şimdi, şablonunda, yapmanız:

Ayrıca üzerinde alanlara başvurabilirsiniz:

{% 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 %} 

Bu

altına yakın, QuerySet.values() documentation kaplıdır OneToOneField, ForeignKey ve ManyToManyField özniteliklerine göre ters ilişkilerle ilgili modeller:

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

Mükemmel çalıştı. Yemin ederim ki Queryset.values ​​() dokümantasyonunu 10 kez anlamaya çalışıyorum ve FK ilişkileri hakkında bu alt bloğu asla okumadım. – zoidberg

+1

Kötü hissetme - İlk başladığımda bunu birden çok kez özledim. Ben şahsen, daha sonra değil, belgelerin özellikli bir parçası olması gerektiğini düşünüyorum. –

İlgili konular