“过早的优化是万恶之源。”
牢记这一点,让我们开始吧!一旦您的应用程序达到某个点,数据非规范化就很常见。如果做得正确,它可以节省大量昂贵的数据库查找,但代价是更多的内务处理。
返回一个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()