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)
Как лучше всего подойти к этому?