Как перезаписать все объекты в базе данных Django после загрузки файла excel?

Итак, у меня есть страница Leaderboard и модель Django, такая как:

models.py

class Leaderboard(models.Model):
    rank = models.IntegerField()
    team_name = models.CharField(max_length=100)
    score = models.IntegerField()

Я запутался в том, как я могу написать функцию views.py так, чтобы каждый раз, когда я делаю запрос и загружаю новый файл excel в views.py, она перезаписывала старые объекты внутри базы данных и заполняла базу новыми данными. Я не уверен, что это правильный способ создания ручной таблицы лидеров, но это единственный способ, который я смог придумать на данный момент.

Что я могу придумать на данный момент:

views.py

def update_leaderboard(request):
    new_excel = request.body
    data = pd.read_excel(new_excel)
    # Overwrite the database here
    ...

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

В данном случае я также использую Django Rest Framework, потому что для фронтенда я использую React. Поэтому представления могут получиться немного другими (?)

Вы можете попробовать что-то вроде этого:

form . models import Leaderboard

def update_leaderboard(request):
    new_excel = request.body
    data = pd.read_excel(new_excel)
    # Overwrite the database here
    ...
    
    # Create a list of dictionaries from a DF
    records = data.to_dict('records')
    
    # Iterate over the list and update each teams records i.e. rank & score
    for r in records:
        team_name = r['team_name']
        rank = r['rank']
        score = r['score']

        Leaderboard.objects.get(team_name=team_name).update(rank=rank, score=score)

        **OR**

        # Using bulk_create and 
        # Deleting all existing records and creatinge new ones from the spreadsheet data.
        Leaderboard.objects.all().delete()

        leaderboard_objs= [ 
             Leaderboard(
                 team_name=r['team_name'],
                 rank=r['rank'],
                 score=r['score'],
                 )
                 for r in records
        ]

    Leaderboard.objects.bulk_create(leaderboard_objs)  

Примечание:

*Для первого метода (Использование обновления) - Если новая команда добавлена в ваш набор данных, это приведет к сбою при вызове 'Leaderboard.objects.get', потому что он не найдет команду, которую вы пытаетесь обновить, если она новая. Вы можете использовать оператор try except или if else, чтобы обойти это, иначе просто используйте второй метод удаления существующих записей и создания новых.

. *Если вы обновляете/создаете большой набор данных, вам лучше использовать методы bulk_update() или bulk_create() вместо create() или update(). https://docs.djangoproject.com/en/4.0/ref/models/querysets/#django.db.models.query.QuerySet.bulk_update

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