首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django模型中存储列表的最有效方法是什么?

在Django模型中存储列表的最有效方法是什么?
EN

Stack Overflow用户
提问于 2009-07-10 23:16:19
回答 13查看 170.2K关注 0票数 165

目前,我的代码中有很多python对象,如下所示:

代码语言:javascript
运行
复制
class MyClass():
  def __init__(self, name, friends):
      self.myName = name
      self.myFriends = [str(x) for x in friends]

现在我想把它变成一个Django模型,其中self.myName是一个字符串字段,self.myFriends是一个字符串列表。

代码语言:javascript
运行
复制
from django.db import models

class myDjangoModelClass():
    myName = models.CharField(max_length=64)
    myFriends = ??? # what goes here?

由于列表在python中是如此常见的数据结构,我多少希望有一个用于它的Django模型字段。我知道我可以使用ManyToMany或OneToMany关系,但我希望在代码中避免这种额外的间接性。

编辑:

我添加了这个related question,人们可能会发现它很有用。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-07-10 15:23:19

将这种关系表示为Friends表的一对多外键关系不是更好吗?我知道myFriends只是字符串,但我认为更好的设计应该是创建一个Friend模型,并让MyClass包含与结果表的外键关系。

票数 94
EN

Stack Overflow用户

发布于 2009-07-11 05:43:46

“过早优化是万恶之源。”

牢记这一点,让我们开始吧!一旦你的应用程序达到某个点,反规范化数据就很常见了。如果做得正确,它可以节省大量昂贵的数据库查找,但代价是更多的内务处理。

要返回一个好友姓名的list,我们需要创建一个定制的Django Field类,该类在被访问时将返回一个列表。

David Cramer在他的博客上发布了一个创建SeperatedValueField的指南。代码如下:

代码语言:javascript
运行
复制
from django.db import models

class SeparatedValuesField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        self.token = kwargs.pop('token', ',')
        super(SeparatedValuesField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if not value: return
        if isinstance(value, list):
            return value
        return value.split(self.token)

    def get_db_prep_value(self, value):
        if not value: return
        assert(isinstance(value, list) or isinstance(value, tuple))
        return self.token.join([unicode(s) for s in value])

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

此代码的逻辑处理从数据库到Python的值的序列化和反序列化,反之亦然。现在,您可以轻松地在模型类中导入和使用我们的自定义字段:

代码语言:javascript
运行
复制
from django.db import models
from custom.fields import SeparatedValuesField 

class Person(models.Model):
    name = models.CharField(max_length=64)
    friends = SeparatedValuesField()
票数 143
EN

Stack Overflow用户

发布于 2011-08-23 02:24:31

在Django中存储列表的一种简单方法是将其转换为JSON字符串,然后将其保存为模型中的文本。然后,您可以通过将(JSON)字符串转换回python列表来检索列表。下面是操作步骤:

"list“将存储在Django模型中,如下所示:

代码语言:javascript
运行
复制
class MyModel(models.Model):
    myList = models.TextField(null=True) # JSON-serialized (text) version of your list

在视图/控制器代码中:

在数据库中存储列表的

代码语言:javascript
运行
复制
import simplejson as json # this would be just 'import json' in Python 2.7 and later
...
...

myModel = MyModel()
listIWantToStore = [1,2,3,4,5,'hello']
myModel.myList = json.dumps(listIWantToStore)
myModel.save()

从数据库检索列表的

代码语言:javascript
运行
复制
jsonDec = json.decoder.JSONDecoder()
myPythonList = jsonDec.decode(myModel.myList)

从概念上讲,是这样的:

代码语言:javascript
运行
复制
>>> myList = [1,2,3,4,5,'hello']
>>> import simplejson as json
>>> myJsonList = json.dumps(myList)
>>> myJsonList
'[1, 2, 3, 4, 5, "hello"]'
>>> myJsonList.__class__
<type 'str'>
>>> jsonDec = json.decoder.JSONDecoder()
>>> myPythonList = jsonDec.decode(myJsonList)
>>> myPythonList
[1, 2, 3, 4, 5, u'hello']
>>> myPythonList.__class__
<type 'list'>
票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1110153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档