Django:模型中的列表字段?

在我的模型中,我想要一个具有三元组列表的字段。 例如`[[1,3,4],[4,2,6],[8,12,3],[3,3,9]]。 有没有可以将这些数据存储在数据库中的字段?

您可以使用JSON将其转换为string,并将其存储为string。

例如,

In [3]: json.dumps([[1, 3, 4], [4, 2, 6], [8, 12, 3], [3, 3, 9]]) Out[3]: '[[1, 3, 4], [4, 2, 6], [8, 12, 3], [3, 3, 9]]' 

你可以在你的课堂上添加一个方法来为你自动转换。

 import json class Foobar(models.Model): foo = models.CharField(max_length=200) def setfoo(self, x): self.foo = json.dumps(x) def getfoo(self): return json.loads(self.foo) 

如果您使用的是Django 1.9和postgresql,则会有一个名为JSONField的新类,您应该使用它。 这是一个链接

在YouTube上有一个很好的关于PostgreSQL JSON和数组的讨论。 看,它有很好的信息。

如果您正在使用PostgreSQL,则可以使用带有嵌套ArrayField的ArrayField: https ://docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/

这样,数据结构将被底层数据库所知晓。 而且,ORM为它带来了特殊的function。

请注意,您将不得不自己创build一个GIN索引(请参阅上面的链接: https : //docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/#indexing-arrayfield ) 。

我认为这会帮助你。

从django.db导入模型
导入ast

 class ListField(models.TextField):
     __metaclass__ = models.SubfieldBase
     description =“存储python列表”

     def __init __(self,* args,** kwargs):
         super(ListField,self).__ init __(* args,** kwargs)

     def to_python(self,value):
        如果没有价值:
            值= []

        如果isinstance(值,列表):
            返回值

        返回ast.literal_eval(值)

     def get_prep_value(self,value):
        如果值是None:
            返回值

        返回unicode(值)

     def value_to_string(self,obj):
         value = self._get_val_from_obj(obj)
        返回self.get_db_prep_value(value)

 class ListModel(models.Model):
     test_list = ListField()

例如:

 >>> ListModel.objects.create(test_list = [[1,2,3],[2,3,4,4]])

 >>> ListModel.objects.get(id = 1)

 >>> o = ListModel.objects.get(id = 1)
 >>> o.id
 1L
 >>> o.test_list
 [[1,2,3],[2,3,4,4]]
 >>> 

如果你使用的是比较现代的Django版本,比如1.10,而你的数据库是Postgres,那么有一个比Django-taggit或其他select更好的新的ArrayField ,因为它是Django框架的本地特性。

 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, ) 

只需使用这些第三方软件包提供的JSON字段:

  • Django的jsonfield
  • Django的烦人

在这种情况下,你不需要关心字段值序列化 – 它会发生在内部。

希望有所帮助。

您可以将列表弄平,然后将值存储到CommaSeparatedIntegerField 。 当您从数据库中读回数据时,只需将数值分组回三。

免责声明:根据数据库规范化理论,最好不要将集合存储在单个字段中; 相反,你会被鼓励将这些三元组中的值存储在自己的字段中,并通过外键链接它们。 但在现实世界中,有时这太麻烦了。

如果您使用的是Google App Engine或MongoDB作为后端,并且您使用的是djangoappengine库,则内置的ListField完全符合您的需要。 此外,查询Listfield可以很容易地find列表中包含元素的所有对象。