在Django中创建数组字段

4 投票
5 回答
8683 浏览
提问于 2025-04-16 20:28

我需要创建一个模型,用来保存某个领域的历史数据,比如说一个调查问卷,它有一个字段来存储答案,这样我就可以用这些数据做一些事情。我在考虑使用多对多字段,但感觉这个太笼统了,似乎为了一个简单的事情做得太复杂了。

5 个回答

0

如果你只是想保存你模型的历史版本,可以使用 django-reversion。这个工具可以为Django模型添加版本控制功能,让你可以保存修改记录、撤销更改等等。

1

我知道这听起来有点反直觉,但你确实应该在你的答案表和投票表之间使用一种通用的关系,比如多对一的外键。这样做的好处是,你的应用可以轻松扩展,以支持未来的想法,比如将一些额外的信息(元数据)与这些答案和投票的组合关联起来,并且能够高效地查询这些元数据,比如“波特兰的人对这个问题的回答是什么”。

如果你真的想要一个简单得不能再简单的数据库结构,那就创建一个主键的数组吧。但不要被 postgres 特有的 ArrayField 所吸引。如果你希望你的 Django 模型能够与除了 postgres 之外的其他数据库(比如 MySQL、MariaDB 或 sqlite)一起使用,你需要把这个数组存储为字符串格式。最简单的格式是 json 字符串,但其他格式也可以,甚至是 csv 格式也没问题。

3

Django 1.8 版本支持一种叫做 ArrayField 的字段类型,这种字段是专门为 PostgreSQL 数据库设计的。

from django.db import models
from django.contrib.postgres.fields import ArrayField

class ChessBoard(models.Model):
    board = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
    )

撰写回答