目前,我的代码中有很多python对象,如下所示:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
现在我想把它变成一个Django模型,其中self.myName是一个字符串字段,self.myFriends是一个字符串列表。
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
由于列表在python中是如此常见的数据结构,我多少希望有一个用于它的Django模型字段。我知道我可以使用ManyToMany或OneToMany关系,但我希望在代码中避免这种额外的间接性。
编辑:
我添加了这个related question,人们可能会发现它很有用。
发布于 2009-07-10 15:23:19
将这种关系表示为Friends
表的一对多外键关系不是更好吗?我知道myFriends
只是字符串,但我认为更好的设计应该是创建一个Friend
模型,并让MyClass
包含与结果表的外键关系。
发布于 2009-07-11 05:43:46
“过早优化是万恶之源。”
牢记这一点,让我们开始吧!一旦你的应用程序达到某个点,反规范化数据就很常见了。如果做得正确,它可以节省大量昂贵的数据库查找,但代价是更多的内务处理。
要返回一个好友姓名的list
,我们需要创建一个定制的Django Field类,该类在被访问时将返回一个列表。
David Cramer在他的博客上发布了一个创建SeperatedValueField的指南。代码如下:
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的值的序列化和反序列化,反之亦然。现在,您可以轻松地在模型类中导入和使用我们的自定义字段:
from django.db import models
from custom.fields import SeparatedValuesField
class Person(models.Model):
name = models.CharField(max_length=64)
friends = SeparatedValuesField()
发布于 2011-08-23 02:24:31
在Django中存储列表的一种简单方法是将其转换为JSON字符串,然后将其保存为模型中的文本。然后,您可以通过将(JSON)字符串转换回python列表来检索列表。下面是操作步骤:
"list“将存储在Django模型中,如下所示:
class MyModel(models.Model):
myList = models.TextField(null=True) # JSON-serialized (text) version of your list
在视图/控制器代码中:
在数据库中存储列表的:
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()
从数据库检索列表的:
jsonDec = json.decoder.JSONDecoder()
myPythonList = jsonDec.decode(myModel.myList)
从概念上讲,是这样的:
>>> 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'>
https://stackoverflow.com/questions/1110153
复制相似问题