Django self join с использованием ForeignKey (ORM)
У меня есть Event
Модель:
class Event(models.Model):
message = models.CharField(max_length=128)
timestamp = models.DateTimeField()
cancels_event = models.ForeignKey('self', on_delete=models.CASCADE)
Я анализирую множество сообщений о событиях, но сначала мне нужно проверить, не было ли событие отменено.
Допустим, я получаю Event_1
, затем я получаю Event_2
с Event_2.cancels_event=Event_1
, поэтому Event_2
отменяет Event_1
.
Я хочу узнать, задав подмножество Событий, какие События из этого подмножества были отменены.
В SQL я бы использовал соединение с self:
SELECT * FROM Event e1
JOIN Event e2
ON e1.id = e2.cancels_event
Но я не знаю, как это сделать в рамках Django ORM.
Этот код не использует join, но работает.
canceled_list= Event.objects.all().values_list('cancels_event')
result = Event.objects.filter(pk__in = canceled_list)
Вы можете фильтровать с помощью:
Event.objects.filter(
event__isnull=False
)
или если вы хотите предотвратить возвращение одного и того же Event
несколько раз, вы можете добавить .distinct()
:
Event.objects.filter(
event__isnull=False
).distinct()