Более эффективный способ обновления нескольких объектов модели, каждый из которых имеет уникальные значения
Я ищу более эффективный способ обновления кучи объектов модели. Каждый вечер у меня есть фоновые задания, создающие объекты 'NCAABGame' из API после того, как счет становится окончательным.
Утром я должен обновить все поля в модели со статистикой, которую не предоставил API.
На данный момент я получаю статистику в формате excel, копирую и вставляю каждое обновление и запускаю его следующим образом:
NCAABGame.objects.filter(
name__name='San Francisco', updated=False).update(
field_goals=38,
field_goal_attempts=55,
three_points=11,
three_point_attempts=24,
...
)
На днях было 183 игры, в большинстве дней от 20 до 30, так что это может быть очень своевременным, если делать это таким образом. Я просмотрел bulk_update и несколько других вещей, но не могу найти решение. Я уверен, что есть что-то простое, чего я просто не вижу.
Я ценю любые идеи или решения, которые вы можете предложить.
Если вам все равно нужно вручную обновлять каждый объект, создаваемый через API, я бы даже не стал возиться с Django. Просто загрузите игры из API прямо в Excel, затем внесите правки в Excel и сохраните в CSV-файл. Затем я бы добавил CSV непосредственно в таблицу базы данных, если только нет конкретной причины, по которой объекты должны быть созданы через Django? Я имею в виду, что вы, конечно, можете сделать это с помощью чего-то вроде приведенного ниже, который можно модифицировать, чтобы он также работал для вашего текущего метода через обновления, но тогда вам нужно сначала получить правильный pk объекта, который вы хотите обновить.
import csv
with open("my_data.csv", 'r') as my_data_file:
reader = csv.reader(my_data_file)
for row in reader:
# get_or_create returns a tuple. 'created' is a boolean that indicates
# if a new object was created or not, with game holding the object that
# was either retrieved or created
game, created = NCAABGame.objects.get_or_create(
name=row[0],
field_goals=row[1],
field_goal_attempts=row[2],
....,
)