Как сохранить список чисел в модели Django
Я получаю некоторые данные из API и хочу сохранить их в моей модели Django. Данные представляют собой бейсбольный иннинг, а затем пробежки, забитые в этом иннинге, и приходят ко мне следующим образом...
"innings":[
0:0
1:3
2:0
3:0
4:1
5:2
6:0
7:0
8:4
]
Я обращаюсь к каждому отдельному значению как...
for game in games:
first_inning = game['scoreboard']['score']['innings'][0]
second_inning = game['scoreboard']['score']['innings'][1]
etc...
Но если я хочу сохранить все данные как есть и начать записи с 1 вместо 0, какой тип поля я должен использовать и как это сделать? Это будет ArrayField?
Я очень ценю вашу помощь.
Одним из вариантов является ArrayField, он индексируется 0, как и любой список в python, и вы не можете изменить это.
Другой вариант - смоделировать Inning как отдельную модель, на случай, если вы захотите выполнять запросы типа "средний счет на 3-м иннинге" и т.д. Вы сможете корректировать номера иннингов так, как вам нужно.
class Inning(models.Model):
game = models.ForeignKey('game.Game', on_delete=models.CASCADE)
number = models.PositiveIntegerField()
score = models.PositiveIntegerField()
class Meta:
unique_together = [('game', 'number')]
Вы можете использовать JSONField. Его преимущество заключается в том, что вы можете форматировать его так, как хотите, чтобы хранить данные в соответствии с тем, что вы получаете от API. В вашей модели вы можете определить поле следующим образом:
class SomeModel(models.Model):
....
innings_score = models.JSONField(default=dict)
Здесь я бы посоветовал вам использовать значение по умолчанию, потому что об этом говорится в официальных документах:
Если вы задаете поле по умолчанию, убедитесь, что это неизменяемый объект, такой как например, str, или вызываемый объект, который возвращает свежий изменяемый объект каждый раз, например, dict или функция. Предоставление изменяемого объекта по умолчанию объект, например default={} или default=[], разделяет один объект между всеми экземплярами модели.
Затем вы можете использовать сохранение данных как обычного словаря в модели:
SomeModel.objects.create(...., innings_score={0:0,
1:3,
2:0,
3:0,
4:1,
5:2,
6:0,
7:0,
8:4})
Поскольку это словарь, вы можете начать работу с 1, назвав ключ 1 вместо 0 (т.е. пропустить первое значение), и так далее.
Есть несколько способов в зависимости от вашей проблемы.
вы можете хранить ваши данные в
ArrayField. ноArrayFieldспецифичен только для базы данных PostgreSQL. (более подробная информация здесь)вы можете преобразовать ваши данные в JSON и хранить их в JSONField (более подробная информация о JSONField находится здесь).
Моим предложением является решение номер 2, поскольку вы читаете сериализованные данные из API.
Надеюсь, это поможет вам.