2016-06-22 9 views
1

Lassen Sie uns sagen, ich habe 2 Tabellen in meiner DB. Einer von ihnen heißt Person mit den Attributen name und id, der andere heißt Role mit den Attributen person (das ist ein Fremdschlüssel für die id in der Tabelle Person) und id. Jetzt möchte ich eine Abfrage machen, die einen Namen wie David, findet alle Personen mit diesem Namen und gibt auch die damit verbundenen Rollen. Wir wissen, dass jede Person höchstens einer Rolle zugeordnet ist.django bekommen Modell mit Fremdschlüssel

Ich weiß, dass ich nicht Person.objects.filter(name=David).select_related('Role') verwenden kann, weil Rolle nicht Person Attribut ist. Gibt es das überhaupt, kann ich das mit nur 1 Hit zur DB bekommen?

Antwort

1

Dies ist in der Tat eine sehr einfache Abfrage, im Gegensatz zu einigen der anderen Antworten. Die Sache zu erinnern ist, dass wenn Sie Rollen möchten, sollten Sie mit dem Vorbild beginnen. Also folgen Sie einfach den Beziehungen von dort rückwärts:

+0

Nein. Ich brauche auch das Person-Objekt. Grundsätzlich suche ich nach einer Möglichkeit, sowohl Rolle als auch Person mit 1 Treffer in die DB zu bekommen. –

+0

Dann fügen Sie 'select_related ('person')' hinzu. –

0

Um die Personen zu bekommen, ist es, wie Sie bereits schrieb:

Person.objects.filter(name='David') 

alle Rollen für jede Person im Zusammenhang Um David genannt:

Role.objects.filter(person__name='David') 

die Rollen von einer bestimmten Person zu erhalten :

Also, was ich von Ihrer Frage verstehe, ist, dass Sie so etwas tun möchten:

for person in Person.objects.filter(name='David'): 
    person_roles = Role.objects.filter(person=person) 
    # ... 
    # do something with person_roles (that should contain 
    # at most one object according to your constraints). 
+0

So gibt es keine Möglichkeit, die Personen mit dem Namen David und die zugehörigen Rollen in einer Abfrage zu bekommen? –

+1

Nein: Das Ergebnis der Abfrage müsste in einem sehr komplizierten Python-Objekt gespeichert werden, wenn das möglich wäre ... – viron