Сохраните все данные в базе данных одним запросом в 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

)

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