Какой самый быстрый способ отфильтровать набор запросов django на основе пользовательского метода? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть рекурсивная модель. Давайте назовем это Organization. У меня есть другая модель, которая является дочерью Organization и называется Store.

Когда в приложении перечислены Store, это происходит в иерархическом формате, поэтому мы на самом деле получаем Organization и включаем рекурсивную иерархию под ними. В сериализаторе мы передаем параметры для фильтрации Store и возвращаем None, если хранилище не соответствует фильтрам.

Однако подвох заключается в том, что Organization будет по-прежнему возвращаться, даже если у него нет Stores, что приводит к тому, что в таблице будет множество пустых страниц, если Store не соответствует фильтрам.

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

queryset = [x for x in queryset if x.will_have_store()]

def will_have_store(self):
        willHaveStore = False
        for organization in self.organizations.all():
            willHaveStore = organization.will_have_store()
            if (willHaveStore):
                return True
            if (hasattr(organization, 'store') and organization.store.id ):
                willHaveStore = True
        return willHaveStore

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

1 Ответ

0 голосов
/ 13 июня 2019

Решение, которое я выбрал, заключалось в том, чтобы отфильтровать нужные мне магазины и получить организации, а не отфильтровать организации по свойствам магазина.

Фильтр магазинов
различные способы сделать это

Получить всех родителей магазинов

all_orgs = []
for store in store_queryset:
  all_orgs.push(store.get_all_parents())

Получить все организации

queryset = Organizations.objects.filter(organization__in=all_orgs)

Затем верните орг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...