ich ein Modell mit einfachen Beziehung habenDjango prefetch_related - Filter mit or-Klausel aus verschiedenen Tabellen
class Tasks(models.Model):
initiator = models.ForeignKey(User, on_delete = models.CASCADE)
class TaskResponsiblePeople(models.Model):
task = models.ForeignKey('Tasks')
auth_user = models.ForeignKey(User)
Und ich brauche ein Analogon von einer SQL-Abfrage zu schreiben, wie folgt:
select a.initiator, b.auth_user
from Tasks a
inner join TaskResponsiblePeople b
on TaskResponsiblePeople.task_id = task.id
where Tasks.initiator = 'value A' OR TaskResponsiblePeople.auth_user = 'value B'
Die Problem ist, dass die OR-Anweisung zwei verschiedene Tabellen behandelt und ich habe keine Ahnung von der richtigen Django-Syntax, um die oben genannte Raw-SQL-Abfrage zu mimikieren. Hilf mir bitte!
UPDATE 1
Nach der unten angegebenen Antwort, verwende ich den folgenden Code:
people = TaskResponsiblePeople.objects.filter(Q(task__initiator = request.user.id)|Q(auth_user = request.user.id)).select_related('auth_user')
print people.query
# The result of the print copy-pasted from console
# SELECT * FROM `task_responsible_people`
# LEFT OUTER JOIN `tasks` ON (`task_responsible_people`.`task_id` = `tasks`.`id`)
# LEFT OUTER JOIN `auth_user` T4
# ON (`task_responsible_people`.`auth_user_id` = T4.`id`)
# WHERE (`tasks`.`initiator_id` = 7 OR
# 'task_responsible_people`.`auth_user_id` = 7)
tasks = Tasks.objects.prefetch_related(
Prefetch('task_responsible_people', queryset=people, to_attr='people'))
jedoch in der letzten resultset kann ich noch Aufzeichnungen sehen, wo weder Initiator noch auth_user sind gleich zu request.user (in diesem Fall gleich 7) Ich vermeide die Verwendung von ".values" wegen der möglichen Notwendigkeit, das Queryset in json zu serialisieren und zu transformieren.
und Sie wollen beide 'Tasks' und' TaskRespons "iblePeople" in dem resultierenden Abfrage-Set? – AKS
Ja, genau. Ich habe die obige Frage bearbeitet, um dies zu verdeutlichen. –
Schauen Sie sich meine Antwort an. Es sollte die richtige Abfrage generieren. – AKS