Django создает эффективный способ зацикливания транзакций и категорий для сокращения обращений к базам данных

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

Я знаю, что QuerySet может быть построен, отфильтрован, нарезан и вообще передан без попадания в базу данных. Никакой активности базы данных не происходит, пока вы не сделаете что-то для оценки набора запросов.

В приведенном ниже коде мне редко приходится создавать новую категорию, если она еще не существует, но код "кажется" запрашивает базу данных для каждого элемента в цикле response.json из-за categories.objects.getorcreate строки:

        categories = Category.objects.all()
        __new_transactions = []
        for item in response.json:
            category = categories.objects.getorcreate(code=item['category_code'])
            transaction = Transaction(
                category=category
            )
            __new_transactions.append(transaction)
        # Save the transactions to the database in bulk.
        Transaction.objects.bulk_create(__new_transactions)

Можно ли сделать вышеописанное более эффективным?

Моя первоначальная идея заключалась в том, чтобы проверить, есть ли категория транзакции в списке категорий. Однако это обширный список (5000 элементов) в этой строке item['category'] in categories

            categories = Category.objects.all()
            __new_transactions = []
            for item in response.json:
                # check if the transaction category is in the categories list
                if item['category'] in categories:
                    category=categories.get(code=item['category'])
                else:
                  Category.objects.create(code=item['category'], name=item['category'])  
                category = categories.objects.getorcreate(code=item['category_code'])
                transaction = Transaction(
                    category=category
                )
                __new_transactions.append(transaction)
            # Save the transactions to the database in bulk.
            Transaction.objects.bulk_create(__new_transactions)

Как лучше всего подойти к этому?

Вернуться на верх