Как обновить существующие данные и создать новую базовую команду django? - PullRequest
0 голосов
/ 19 марта 2020

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

from django.core.management.base import BaseCommand
import requests
from demo.models import CoronaAge, CoronaSex, CoronaComorbidity

class Command(BaseCommand):
    def handle(self, *args, **kwargs):
        url = 'https://api.the2019ncov.com/api/fatality-rate'
        r = requests.get(url)
        titles = r.json()
        print(titles)

       # For between age
        for title in titles['byAge'] or []:
            CoronaAge.objects.update_or_create(
                age=title['age'],
                rate=title['rate']
            )

        context = {'titles': CoronaAge.objects.all()}

        # for sex wise male and female
        for title in titles['bySex'] or []:
            CoronaSex.objects.update_or_create(
                sex=title['sex'],
                rate=title['rate']
            )

        context = {'titles': CoronaSex.objects.all()}

        for title in titles['byComorbidity'] or []:
            CoronaComorbidity.objects.update_or_create(
                condition=title['preExistingCondition'],
                rate=title['rate']
            )

        context = {'titles': CoronaComorbidity.objects.all()}

1 Ответ

0 голосов
/ 19 марта 2020

Вот как бы я решил это. Получить список существующих данных. Затем для каждой новой записи проверьте, существует ли она в БД, создайте новый объект, добавьте в список и, в конце, запустите bulk_create, чтобы вставить все из них одним ударом. Если существует, обновите все поля, которые вы хотите, и снова запустите массовое обновление в конце.

corona_ages = CoronaAge.objects.all()
new_ages = []
existing_ages = []
for title in titles['byAge'] or []:
    entry = corona_ages.filter(age=title['age']).first():
    if not entry:
        new_data = CoronaAge(**title)
        new_ages.append(new_data)
    else:
        entry['some_param'] = title['some_param']
        entry['other_param'] = title['other_param']
        existing_ages.append(new_date)

CoronaAge.objects.bulk_create(new_ages)
CoronaAge.objects.bulk_update(existing_ages)
...