目前我正在尝试使用djangoappengine将现有的Google App Engine应用程序从webapp2移植到django。
在内存空间中是否存在使用Django存储数据的方法?因为GAE中为免费用户存储的数量有限制。
webapp2模型代码
class TagTrend_refine(ndb.Model):
tag = ndb.StringProperty()
trendData = ndb.BlobProperty(compressed=True)
我知道TextField可以存储大量文本,但是它可以使用较少的内存存储吗?是否可以使用BlobField?
为trendData存储的数据示例(最多24783个字符)是
{"2008": "{\"nodes\": [{\"group\": 0, \"name\": \"ef-code-first\", \"degree\": 6}, {\"group\": 1, \"name\": \"gridview\", \"degree\": 6}, {\"group\": 2, \"name\": \"mvvm\", \"degree\": 6}, {\"group\": 1, \"name\": \"webforms\", \"degree\": 6}, {\"group\": 2, \"name\": \"binding\", \"degree\": 6}, {\"group\": 3, \"name\": \"web-services\", \"degree\": 6}, {\"group\": 2, \"name\": \"datagrid\", \"degree\": 6},...
答案 0 :(得分:1)
Django本身并没有一种存储压缩数据的方法,但是在将数据保存到数据库之前,可以使用zlib
模块压缩数据。
以下是Django中此类字段的示例实现:
class CompressedTextField(models.TextField):
def __init__(self, compress_level=6, *args, **kwargs):
self.compress_level = compress_level
super(CompressedTextField, self).__init__(*args, **kwargs)
def to_python(self, value):
value = super(CompressedTextField, self).to_python(value)
return zlib.compress(value.encode(), self.compress_level)
def get_prep_value(self, value):
value = super(CompressedTextField, self).get_prep_value(value)
return zlib.decompress(value).decode()
此字段与常规TextField
相比具有额外参数:
class TagTrend(models.Model):
tag = models.CharField(max_length=1024)
# zlib offers compression levels 0-9
# 0 is no compression
# 9 is maximum compression
trendData = CompressedTextField(compress_level=9)
例如,压缩时存储字符串'a' * 1024
(1024字节)只有17个字节。
请注意,使用此类字段的限制是数据以压缩方式存储。这意味着您的数据库查询将使用压缩版本进行搜索/过滤。