2016-06-13 8 views
-1

Ich habe zwei ModelleDjango kommen wie Abfragen

class A(models.Model): 
    id = PGUUIDField(primary_key=True) 
    name = CharField(max_length=32) 
    prefix = CharField(max_length=64) 
    controller = models.ForeignKey(Controller) 
    location = models.ForeignKey(B, related_name="blink") 

class B(models.Model): 
    id = PGUUIDField(primary_key=True) 
    name = CharField(max_length=128) 

Die Tabelle für A enthält viele A-Objekte und die Tabelle für B enthält viele B-Objekte.

raw sql Ich kann ...

SELECT b.* FROM B AS b 
JOIN A AS a 
ON b.id = a.location_id 

Und ich bekomme eine Liste aller Objekte, die B A einen Fremdschlüssel hat.

Aber ich kann nicht für das Leben von mir herausfinden, wie man das mit reinem Django macht. Können Sie mir bitte sagen, wie?

Ich habe select_related nachgeschlagen und es versucht, aber ich muss etwas falsch machen. Ich erhalte eine queryset von A-Objekte

Derzeit die mit folgenden:

queryset2 = [] 
    try: 
     qs = A.objects.all().values('location_id') 
     queryset2 = B.objects.filter(id__in=qs) 
     print queryset2 
     self.fields['location'].queryset = queryset2 
+1

Dies wird in [Teil 2 des Lernprogramms] (https://docs.djangoproject.com/en/1.9/intro/tutorial02/) behandelt. –

+0

queryset2 = B.objects.filter (id = a__location_id) --returns --globaler Name 'a__location_id' ist nicht definiert ()
Ich nehme an, Sie haben auf diesen "Choice.objects.filter" Bezug genommen (question__pub_date__year = current_year) "im Tutorial –

+0

Nein, ich beziehe mich nicht darauf. Sie tun auch nicht, was sie im Tutorial tun. Beachten Sie, dass die Syntax für den doppelten Unterstrich für den _name des Arguments_ und nicht für das Argument selbst gilt. Aus diesem Grund erhalten Sie einen Namensfehler, weil Sie auf eine Variable namens "a__location_id" verweisen, die Sie nie definiert haben. –

Antwort

0

Während Sie bei Lesen auf dem tutorial sind, sollte dies, was Sie wollen:

B.objects.prefetch_related('blink').all() 

Mehr zu writing queries

+0

Dies liefert eine Liste aller B-Objekte.Nicht nur die, die A hat einen Fremdschlüssel zu –

+0

Jedes der 'B' Objekte hat zugeordnete' A' Objekte, die von 'b.blink' zugegriffen werden können –

+0

Vielen Dank, aber ich muss noch etwas fragen. Wie bekomme ich die Abfrage nur der zugehörigen Elemente? –