Как оптимизировать фильтрацию набора запросов - PullRequest
0 голосов
/ 28 мая 2020

У меня есть небольшой фрагмент кода:

    for prop in Property.objects.all():
        for platform_device in prop.platformdevice_set.all():
            if platform_device.platform == cur_platform:
                if platform_device.applicable_devices.filter(name=cur_device).exists():
                    if platform_device.applicable_events.filter(name=cur_event).exists():
                        print("Found my correct even and need to continue processing.")
                    else:
                        for group in platform_device.event_group.all():
                            if group.applicable_events.filter(name=cur_event).exists():
                                print("Found my correct even and need to continue processing.")

Это немного беспорядочно, но пока работает. Я застрял в этой части:

                    if platform_device.applicable_events.filter(name=cur_event).exists():
                        print("Found my correct even and need to continue processing.")
                    else:
                        for group in platform_device.event_group.all():
                            if group.applicable_events.filter(name=cur_event).exists():
                                print("Found my correct even and need to continue processing.")

По сути, я проверяю platform_device.applicable_events, чтобы проверить, содержится ли внутри него мой cur_event. Если это так, то мне нужно продолжить обработку с этой точки.

Else

Я собираюсь просмотреть event_group (который представляет собой просто группировку событий) и проверить, находится ли cur_event внутри одна из этих групп, а затем продолжить обработку.

Мой вопрос в том, как я могу сделать так, чтобы оба эти направления оказались в одном месте. Я просто пытаюсь предотвратить использование одного и того же кода в обоих этих местах.

1 Ответ

0 голосов
/ 29 мая 2020

Я бы постарался сделать как можно больше работы с базой данных. Вместо «фильтрации» набора запросов в python, отфильтруйте его в базе данных.

for prop in Property.objects.filter(
    platformdevice__platform=cur_platform,
    platformdevice__applicable_devices=cur_device,
).filter(
    Q(platformdevice__applicable_events=cur_event) 
    | Q(platform_device__event_group__applicable_events__name=cur_event)
):
    #continue processing

foo__bar=baz фильтрует связанную таблицу foo для столбца bar со значением baz. Для фильтрации значения A или B вы можете использовать Q-выражения

  • или: Q(..) | Q(..)
  • и: Q(..) & Q(..) (аналогично обычному фильтру)
...