Ich vermisse etwas offensichtlich, aber ich habe Probleme, eine Join auf einem ManyToMany Feld in einer Django App arbeiten. Ich habe zwei Modelle:Joining ManyToMany Felder mit prefetch_related in Django
class Area(models.Model):
name = CharField(...)
class Role(models.Model):
name = CharField(...)
areas = ManyToManyField('Area', ...)
Mein Ziel ist es, das Äquivalent dieser Abfrage zu haben:
select a.name, r.name
from area a
join area_role ar on ar.area_id = a.id
join role r on ar.role_id = r.id
order by a.name, r.name
Der resultierende Datensatz würde wie folgt aussehen:
Area Role
---------------------
A My Role
A Your Role
A Yo Mamas Role
B My Role
B Some Other Role
Wie Sie sehen in kann Das Beispiel, die Meine Rolle Element erscheint zweimal, einmal für jeden Bereich. Ich weiß, dass ich die Liste der Bereiche bekommen und dann eine Liste von Rollen für jeden bekommen kann (was zu N + 1 Abfragen führt), aber ich möchte, wenn möglich, effizient sein. Als solche habe ich festgestellt, dass prefetch_related könnte was ich verwenden wollte. Wenn ich dies verwende, habe ich jedoch alle Area-Werte als None. Hier ist, was ich versucht habe:
Die Rollennamen kommen für die Fahrt korrekt, aber die Bereichsnamen nicht. Was mache ich hier falsch?
nicht verwandt: warum setzen Sie 'Area' zwischen Anführungszeichen in' Bereiche = ManyToManyField ('Area', ...) '? – Pynchia
'print (" Gebietsname: "+ str (r.areas__name))' meinst du 'print (" Gebietsname: "+ str (r.areas.name))'? – danielcorreia
@Pynchia könnte er Bereich ohne Anführungszeichen in diesem Fall verwenden, da Bereich vor Rollenmodell definiert ist. Wenn Area nach Role definiert wäre, wären Zitate erforderlich. [Vollständige Erklärung hier] (https://docs.djangoproject.com/en/1.8/ref/models/fields/#lazy-relationships) – danielcorreia