如何在Django模型中存储字符串数组?

时间:2010-11-27 21:36:10

标签: python django django-models

我正在构建一个Django数据模型,我希望能够在其中一个变量中存储一个字符串数组;我怎么能这样做?

e.g。

class myClass(models.Model):
    title = models.CharField(max_length=50)
    stringArr = models.???

感谢您的帮助。

6 个答案:

答案 0 :(得分:9)

您可以使用一些像JSON这样的序列化机制。有一个字段定义的片段可能对你有用:

http://djangosnippets.org/snippets/1478/(请查看上一条评论中的代码)

使用此类字段,您可以将字符串无缝地放入列表中并将其分配给此类字段。字段抽象将完成其余的工作。与阅读相同。

答案 1 :(得分:7)

创建另一个包含带有可选订单的字符串的模型,将ForeignKey返回myClass,然后将数组存储在那里。

答案 2 :(得分:4)

你可以使用cPickle ......

class myClass(models.Model):
    title = models.CharField(max_length=50)
    stringArr = models.TextField()

from cPickle import loads, dumps
data = [ { 'a':'A', 'b':2, 'c':3.0 } ]
obj = Myclass.objects.get(pk=???)
# pickle data into a string-like format
obj.stringArr = dumps(data)
obj.save()
# restore original data
data = loads(obj.stringArr)

答案 3 :(得分:3)

我为模型完成了此操作,

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


class Skill(models.Model):
    name = models.CharField(max_length=50)
    skills = ArrayField(models.CharField(max_length=200), blank=True)

要创建

Skill.objects.create(name='First name', skills=['thoughts', 'django'])

要查询

Skill.objects.filter(skills__contains=['thoughts'])

您可以参考django文档以获取更多帮助

https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/

我希望这会有所帮助

答案 4 :(得分:1)

如果您使用的是PostgreSQL或MongoDB(带有djongo),您可以这样做

对于PostgreSQL:

from django.contrib.postgres.fields import ArrayField

对于MongoDB(带有Djongo):

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

然后

stringArr = ArrayField(models.CharField(max_length=10, blank=True),size=8)

以上两种情况都适用。

答案 5 :(得分:0)

您可以使用JSONField来实现以下功能:

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

class TestModel(models.Model):
    title = models.CharField(max_length=100)
    strings = JSONField(default=list, blank=True, null=True)

    def __str__(self):
        return self.title

例如:

In [1]: fruits = ['banana', 'apple', 'orange']                                                                                                                                         

In [2]: TestModel.objects.create(title='my set', strings=fruits)                                                                                                                       
Out[2]: <TestModel: my set>

In [3]: o = TestModel.objects.first()                                                                                                                                                  

In [4]: o.strings                                                                                                                                                                      
Out[4]: ['banana', 'apple', 'orange']