2017-04-03 4 views
1

Ich arbeite an einem Django-Projekt und versuche, einige verknüpfte Modelle für meine Daten zu erstellen, die funktionieren, aber ich kann nicht herausfinden, wie ich auf die verknüpften Daten zugreifen kann.Django - Daten von Fremdschlüssel holen

class One(models.Model) 
    name = models.CharField(max_length=50) 
    list = models.ArrayField(models.CharField(max_length=50), blank=True) 

    def __str__(self): 
    return self.name 

class Many(models.Model) 
    name = models.CharField(max_length=50) 

    related = models.ForeignKey(One, null=True, blank=True) 

    def __str__(self): 
    return self.name  

Dies ist die allgemeine Beziehung, die ich eingerichtet habe.

Was ich versuche zu tun ist, in einer Vorlage Zugriff auf eine Liste aller 'Ones' haben, und über jede dieser, kann auf jedes Many zugreifen und seine Attribute zugeordnet. Ich kann sehen, wie man auf die Attribute für ein einzelnes 'One' zugreift, aber nicht, wie man alle von ihnen und ihre in Verbindung stehenden 'Many' Modelle und die in Verbindung stehenden Attribute für jedes gibt. Im Wesentlichen würde die Ausgabe, die ich möchte, eine Dropdown-Liste mit den Einsen haben, und wenn dies eingereicht wird, wird einige Javascript die Liste im "Viele" -Modell verwenden, um etwas zu tun.

Jeder Rat würde sehr geschätzt werden.

+0

Sind Sie versuchen, die Benutzeroberfläche mit Ajax-Aufrufe zu aktualisieren heißt auffüllt Optionen in einem zweiten Dropdown basierend auf der Auswahl in der ersten Dropdown-? – AKS

+0

Nein, ich benutze tatsächlich OpenLayers, daher wird die Liste tatsächlich aus Ländernamen bestehen, die auf einer Karte hervorgehoben werden – Nowandthen98

Antwort

1

Wenn Sie bereits Haben Sie die Objekte One Modell Klasse, können Sie die many Objekte mit many_set zugreifen (siehe: backward relations):

{% for one_obj in one_objs %} 
    {% for m_obj in one_obj.many_set.all %} 
     # do stuff with m_obj here 
    {% endfor %} 
{% endfor %} 

Eine wichtige Sache zu beachten ist hier, dass dies eine DB-Abfrage für jede m_obj ausführen wird. Um dies effizient zu machen, können Sie die many_set mit one_objs aus Ihrer Sicht vorabholen.

Ihrer Ansicht verwenden prefetch_related:

one_objs = One.objects.all().prefetch_related('many_set') 
1

Reverse-Lookups sind über das ___set-Attribut eines Objekts zugänglich. So bekommen alle „Viele“ Objekte für eine gegebene „One“ Sie tun können one.many_set

Django reverse lookup of foreign keys

In Bezug auf den Einsatz in einer Vorlage, Sets, indem Sie „alle“ zugänglich sind (da die Menge zurückgibt ein queryset können Sie Abfragen gegen sie ausgeführt werden, einschließlich in der Vorlage)

Access ForeignKey set directly in template in Django

den entsprechenden Abschnitt der Dokumentation Django Siehe: https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

1

Sie können Django verwenden 's "prefetch_related" und Djangos "".

Auch diese Frage wurde beantwortet here.

Obwohl, hier ist das, was Sie vielleicht zunächst Ihre Fremdschlüsseldefinition Um dies zu ändern:

related = models.ForeignKey(One, null=True, blank=True, related_name='relateds') 

Dann können Sie Reverse-holen die Fremdschlüssel:

one = One.objects.get(name="TheOneYouWant").prefetch_related('relateds') 
manys = one.relateds