如何将数字列表保存到 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 开始数据,依此类推。

有一些方法取决于您的问题。

  1. 您可以将数据存储在 ArrayField 中。但 ArrayField 仅特定于 PostgreSQL 数据库。(更多信息 here

  2. 您可以将数据转换为 JSON 并将其存储在 JSONField 中(有关 JSONField 的更多信息是 here)。

我的建议是解决方案 2,因为您正在从 API.

读取序列化数据

希望对你有所帮助