1.减少文本的长度,保存数据的时候压缩,读取的时候解压缩,如果发现压缩后更长,就用原文本直接存储:
1.8以上版本可用
from
django.db
import
models
class
CompressedTextField(models.TextField):
""" model Fields for storing text in a compressed format (bz2 by default) """
__metaclass__
=
models.SubfieldBase
def
to_python(
self
, value):
if
not
value:
return
value
try
:
return
value.decode(
'base64'
).decode(
'bz2'
).decode(
'utf-8'
)
except
Exception:
return
value
def
get_prep_value(
self
, value):
if
not
value:
return
value
try
:
value.decode(
'base64'
)
return
value
except
Exception:
try
:
tmp
=
value.encode(
'utf-8'
).encode(
'bz2'
).encode(
'base64'
)
except
Exception:
return
value
else
:
if
len
(tmp) >
len
(value):
return
value
return
tmp
|
to_python 函数用于转化数据库中的字符到 Python的变量, get_prep_value 用于将Python变量处理后(此处为压缩)保存到数据库,使用和Django自带的 Field 一样。
Django 1.8 以上版本,可以用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#coding:utf-8
from
django.db
import
models
class
CompressedTextField(models.TextField):
"""
model Fields for storing text in a compressed format (bz2 by default)
"""
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
def
to_python(
self
, value):
if
not
value:
return
value
try
:
return
value.decode(
'base64'
).decode(
'bz2'
).decode(
'utf-8'
)
except
Exception:
return
value
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
|