如何将数字列表保存到 Django 模型
How to save a list of numbers to Django model
我正在从 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
,它与任何 python 列表一样是 0 索引的,您无法更改它。
另一种选择是将您的 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)
这里我建议您使用默认值,因为官方文档中提到:
If you give the field a default, ensure it’s an immutable object, such
as a str, or a callable object that returns a fresh mutable object
each time, such as dict or a function. Providing a mutable default
object like default={} or default=[] shares the one object between all
model instances.
然后您可以将数据保存为模型中的普通字典:
SomeModel.objects.create(...., innings_score={0:0,
1:3,
2:0,
3:0,
4:1,
5:2,
6:0,
7:0,
8:4})
由于这是一本字典,您可以通过将键命名为 1 而不是 0(即跳过第一个值)来从 1 开始数据,依此类推。
有一些方法取决于您的问题。
您可以将数据存储在 ArrayField
中。但 ArrayField
仅特定于 PostgreSQL 数据库。(更多信息 here)
您可以将数据转换为 JSON 并将其存储在 JSONField 中(有关 JSONField 的更多信息是 here)。
我的建议是解决方案 2,因为您正在从 API.
读取序列化数据
希望对你有所帮助
我正在从 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
,它与任何 python 列表一样是 0 索引的,您无法更改它。
另一种选择是将您的 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)
这里我建议您使用默认值,因为官方文档中提到:
If you give the field a default, ensure it’s an immutable object, such as a str, or a callable object that returns a fresh mutable object each time, such as dict or a function. Providing a mutable default object like default={} or default=[] shares the one object between all model instances.
然后您可以将数据保存为模型中的普通字典:
SomeModel.objects.create(...., innings_score={0:0,
1:3,
2:0,
3:0,
4:1,
5:2,
6:0,
7:0,
8:4})
由于这是一本字典,您可以通过将键命名为 1 而不是 0(即跳过第一个值)来从 1 开始数据,依此类推。
有一些方法取决于您的问题。
您可以将数据存储在
ArrayField
中。但ArrayField
仅特定于 PostgreSQL 数据库。(更多信息 here)您可以将数据转换为 JSON 并将其存储在 JSONField 中(有关 JSONField 的更多信息是 here)。
我的建议是解决方案 2,因为您正在从 API.
读取序列化数据希望对你有所帮助