LEFT JOIN Django ORM
Habe ich die folgenden Modelle:
class Volunteer(models.Model):
first_name = models.CharField(max_length=50L)
last_name = models.CharField(max_length=50L)
email = models.CharField(max_length=50L)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
class Department(models.Model):
name = models.CharField(max_length=50L, unique=True)
overseer = models.ForeignKey(Volunteer, blank=True, null=True)
location = models.CharField(max_length=100L, null=True)
class DepartmentVolunteer(models.Model):
volunteer = models.ForeignKey(Volunteer)
department = models.ForeignKey(Department)
assistant = models.BooleanField(default=False)
keyman = models.BooleanField(default=False)
captain = models.BooleanField(default=False)
location = models.CharField(max_length=100L, blank=True, null=True)
Ich möchte die Abfrage für alle Abteilungen, die keine Freiwilligen zugewiesen. Ich kann so tun, mithilfe der folgenden Abfrage:
SELECT
vsp_department.name
FROM
vsp_department
LEFT JOIN vsp_departmentvolunteer ON vsp_department.id = vsp_departmentvolunteer.department_id
WHERE
vsp_departmentvolunteer.department_id IS NULL;
Gibt es eine weitere django-ähnliche Art und Weise, dies zu tun, oder sollte ich gehen Sie einfach mit raw-sql?
InformationsquelleAutor hanleyhansen | 2014-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies tun, indem Sie die folgenden die rückwärts-Verhältnis in der Suche.
Hier sind die docs, die auf die Abfragen "Spanning mehrwertige Beziehungen": https://docs.djangoproject.com/en/stable/topics/db/queries/#spanning-multi-valued-relationships
Ist Ihre Abfrage die Prüfung gegen das id-Feld in DepartmentVolunteer? Oder wird Django um die Beziehung und die überprüfung gegen die department_id Feld?
Es ist die Prüfung gegen die
department
Spalte in derDepartmentVolunteer
was ist ein FK zuDepartement
und daher Spiele auch auf seine ID.Gotcha. Macht Sinn. Danke.
Dies ist ein outer-join. Was, wenn Sie nicht möchten, dass der right join entspricht auch drin...?
InformationsquelleAutor Mark Lavin
Mir wurden müssen benutzerdefinierte join-Modelle, implizite Felder
es funktioniert für mich auf django 1.9.
aber es ist mehr, scheinen an der Krücke
Wenn jemand weitere elegante Lösung bitte teilen für Menschen
Ergebnis:
hier Beispiel für die Verwendung mit der zusätzlichen Bedingung, und legen Sie die Tabelle alias(aber es scheint so, als Krücke)
ich es von
sql werden
queryset.query.alias_map['my_outer_table'].join_field.get_extra_restriction = extra_join_cond
oh, gut, ich werde es auch benutzen
Danke @madjardi. Deine Antwort hat mir geholfen bei der Lösung dieses Problems: stackoverflow.com/a/42816689/2367394
InformationsquelleAutor madjardi
Diese scheint zu funktionieren:
Sehen docs für mehr details.
InformationsquelleAutor hanleyhansen
für das erstellen von benutzerdefinierten Verknüpfung durch ODER
InformationsquelleAutor madjardi