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列表中包含元素的所有对象。