2014-11-28 12 views
8

Ich habe eine Django-App, wo mein Hauptmodell ForeignKey-Felder zu anderen DB-Tabellen hat.Django: Verwenden von objects.values ​​() und ForeignKey Daten in Vorlage

Alle ForeignKey-Tabellen verfügen über eine Unicode-Funktion, die den Namen zurückgibt, der in der Vorlage angezeigt werden soll.

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 

In der Ansicht, ich bin mit der Abfrage wie:

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

In der Vorlage kann ich durch sie durchlaufen, und richtig ForeignKey Wert anzuzeigen.

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

Das Problem, das ich habe ist, dass ich die Bugs Daten manipulieren müssen, bevor es auf die Vorlage zu senden, so dass ich die Werte() -Methode ein Wörterbuch zurückzukehren. Wenn ich dieses Wörterbuch an die Vorlage übergebe, werden keine Felder angezeigt, die auf ForeignKey verweisen.

Ich bin ziemlich sicher, dass der Grund ist, dass die Werte nur den tatsächlichen Datenbankwert zurückgibt, so dass es nicht der FK folgen kann.

Die Frage ist, wie kann ich die Daten manipulieren, die es an die Vorlage senden, und trotzdem dem ForeignKey folgen?

Antwort

14

Ich benutze diese Methode die ganze Zeit. Du hast Recht. Es gibt nur die Werte zurück, daher müssen Sie die "__" -Notation verwenden, um den Wert vom ForeignKey zu erhalten. Zum Beispiel:

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

nun in der Vorlage, tun Sie:

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

Dies ist in der QuerySet.values() documentation bedeckt, in der Nähe der Unterseite:

Sie können auch auf Felder beziehen sich auf verwandte Modelle mit umgekehrten Beziehungen durch OneToOneField, ForeignKey und ManyToManyField Attribute:

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

Das hat perfekt funktioniert. Ich schwöre, dass ich die Queryset.values ​​() -Dokumentation zehn Mal gelesen habe, um das herauszufinden und nie diesen unteren Block über die FK-Relationen zu lesen. – zoidberg

+1

Fühlen Sie sich nicht schlecht - das habe ich schon mehrfach vermisst, als ich anfing. Ich persönlich denke, dass sollte ein Feature der Dokumentation sein, nicht ein nachträglicher Einfall. –

Verwandte Themen