Django ForeignKey обратный запрос - PullRequest
0 голосов
/ 30 октября 2019

У меня есть 3 модели, связанные друг с другом с помощью FK:

class MainEvent(models.Model):
    name = models.CharField(max_length=512, blank=True)

class Event(models.Model):
    main_event = models.ForeignKey(MainEvent, blank=True, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=512, blank=True)

class SubEvent(models.Model):
    event = models.ForeignKey(Event, blank=True, null=True, on_delete=models.CASCADE)
    done = models.BooleanField(default=False)

Мне нужно создать один обратный запрос для модели MainEvent, который содержит связанные события и Subevents. Я буду использовать это с Q для фильтрации нескольких опций.

Например:

есть 2 MainEvents, у каждого из них есть 2 или более событий, и у каждого события есть 2 или более Subevents. Я пытаюсь создать один Query примерно так:

 [MainEvent_1:[Event_1:[Subevent_1,Subevent_2,...],Event_2:[Subevent_5,...]], MainEvent_2:[Event_2:[Subevent_2,..]]]

На данный момент я создаю словарь, который содержит желаемый результат, но с этим я не использую отношения Q, такие как & или |.

В конце я использую эти данные в шаблонной таблице, чтобы показать все события и отфильтровать их:

желаемая структура таблицы:

main event_1:
event_1:
subevent_1
subevent_2
event_2:
subev...
...........
main event_2:
event_2:
subev....

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 30 октября 2019
MainEvent.objects.filter(Q(event__subevent__done=True) | Q(event__subevent__done=False))

вы можете использовать что-то вроде этого, а затем получить доступ к под событиям, используя . внутри цикла

for item in query:
    for i in item.event_set.all():
        for j in i.subevent_set.all():
            print(i.name)
            print(j.done)
0 голосов
/ 30 октября 2019

Вы не можете сделать это в одном запросе, но вы можете сделать это в трех запросах, используя prefetch_related():

MainEvent.objects.prefetch_related('event_set', 'event_set__subevent_set').all()

Если все ваши MainEvents имеют Events и все ваши Events иметь SubEvents, вы можете сделать это за один запрос, начав с SubEvents и выполнив группировку в коде:

SubEvent.objects.select_related('event', 'event__main_event').all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...