Сохраните все данные в базе данных одним запросом в Django
Я начинающий программист Django. Я пишу API вызов с rest_framework в Django. при вызове этого API, моя программа соединяется с KUCOIN и получает список всех криптовалют. Я хочу сохранить символ и название этих криптовалют в базе данных. Для сохранения данных в базе данных я использую цикл for и в каждой итерации цикла for я делаю запрос к базе данных и сохраняю данные. мой код :
for currencie in currencies:
name = currencie['name']
symbol = currencie['symbol']
active = (False, True)[symbol.endswith('USDT')]
oms = 'kucoin'
try:
obj = Instrument.objects.get(symbol=symbol, oms=oms)
setattr(obj, 'name', name)
setattr(obj, 'active', active)
obj.save()
except Instrument.DoesNotExist:
obj = Instrument(name=name, symbol=symbol,
active=active, oms=oms)
obj.save()
Запрос к базе данных в каждой итерации цикла for имеет проблему, Как я могу решить эту проблему? Есть ли в Django способ сохранить данные в базе данных одним запросом. Спасибо за помощь.
В Django, если вы хотите сохранить данные в базе данных, вам нужно создать новый объект класса:
for currencie in currencies:
name = currencie['name']
symbol = currencie['symbol']
active = (False, True)[symbol.endswith('USDT')]
oms = 'kucoin'
try:
obj = Instrument.objects.get(symbol=symbol, oms=oms)
obj.name = name
obj.active = active
obj.save()
except Instrument.DoesNotExist:
obj = Instrument.objects.create(symbol=symbol, oms=oms, name =name, active=active)
obj.save()
Для получения дополнительной документации смотрите ссылку : https://docs.djangoproject.com/en/4.0/ref/models/querysets/#create
Да! Посмотрите на bulk_create() документацию. https://docs.djangoproject.com/en/4.0/ref/models/querysets/#bulk-create
Если у вас есть бд, которая поддерживает параметр ignore_conflicts (все поддерживают, кроме Oracle), вы можете сделать следующее:
new_currencies = []
for currencie in currencies:
name = currencie['name']
symbol = currencie['symbol']
active = (False, True)[symbol.endswith('USDT')]
oms = 'kucoin'
new_currencies.append(Instrument(name=name, symbol=symbol,
active=active, oms=oms))
Instrument.objects.bulk_create(new_currencies, ignore_conflicts=True)
1-лайнер:
Instrument.objects.bulk_create(
[
Instrument(
name=currencie['name'], symbol=currencie['symbol'],
active=currencie['symbol'].endswith('USDT'), oms='kucoin'
)
for currencie in currencies
],
ignore_conflicts=True
)