jango 的官方提供了很多的 Field,但是有时候还是不能满足我们的需求,不过Django提供了自定义 Field 的方法。
get_prep_value 用于将Python变量处理后保存到数据库,使用和Django自带的 Field 一样。
from_db_value 函数用于转化数据库中的字符到 Python的变量
1.下面是自定义text存储到数据库
#coding:utf-8from django.db import models class CompressedTextField(models.TextField): """ model Fields for storing text in a compressed format (bz2 by default) """ #转化数据库中的字符到Python的变量 def from_db_value(self, value, expression, connection, context): if not value: return value try: return value.decode('base64').decode('bz2').decode('utf-8') except Exception: return value #将Python变量处理后保存到数据库 def get_prep_value(self, value): if not value: return value try: value.decode('base64') return value except Exception: try: return value.encode('utf-8').encode('bz2').encode('base64') except Exception: return value
2.自定义列表存储到数据库
from django.db import modelsimport ast class ListField(models.TextField): __metaclass__ = models.SubfieldBase description = "Stores a python list" def __init__(self, *args, **kwargs): super(ListField, self).__init__(*args, **kwargs) def from_db_value(self, value): if not value: value = [] if isinstance(value, list): return value return ast.literal_eval(value) def get_prep_value(self, value): if value is None: return value return unicode(value) # use str(value) in Python 3 def value_to_string(self, obj): value = self._get_val_from_obj(obj) return self.get_db_prep_value(value)
使用它很简单,首先导入 ListField,像自带的 Field 一样使用:
class Article(models.Model): labels = ListField()
在终端上尝试(运行 python manage.py shell 进入):
>>> from app.models import Article>>> d = Article()>>> d.labels[]>>> d.labels = ["Python", "Django"]>>> d.labels["Python", "Django"]
官方文档,!