目前我的代码中有很多 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 ,人们可能会觉得有用。
最佳答案
“过早的优化是万恶之源。”
牢记这一点,让我们这样做!一旦您的应用程序达到某个点,非规范化数据就很常见了。如果处理得当,它可以节省大量昂贵的数据库查找,但需要多做一些内务处理。
要返回好友名称的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()
关于python - 在 Django 模型中存储列表的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110153/