python - 升级到 django 1.7 - 实例变为 unicode

标签 python django unicode

我最近从 django 1.2.5 迁移到 1.7.0(早就该升级了),正如预期的那样,很多东西都坏了。我已经能够解决很多问题,但我遇到了一个主要问题。

我已将腌制对象存储在数据库中。在 django 1.2.5 中,我运行了以下命令,下面是结果

>>> from app.foo.models import MyModel as s
>>> s.objects.get(id = 34567)
<MyModel: Foo (bar)>
>>> x = s.objects.get(id = 34567)
>>> x.myObject
<foor.bar.My Class instance at 0x3855878>
>>> y = x.myObject 
>>> type(y)
<type 'instance'>

但是在 django 1.7.0 上我得到以下内容

>>> from app.foo.models import MyModel as s
>>> s.objects.get(id = 34567)
<MyModel: Foo (bar)>
>>> x = s.objects.get(id = 34567)
>>> x.myObject

VHJlZUFuc3dlckNob2ljZQpwMjYyCihkcDI2MwpnNDEKUydXZWJzaXRlJwpwMjY0CnNnNDMKKGxwMjY1CnNiYShpbm9lLnN1cnZleTIudHJlZXN1cnZleQpUcmVlQW5zd2VyQ2hvaWNlCnAyNjYKKGRwMjY3Cmc0MQpTJ0VwYXBlcicKcDI2OApzZzQzCihscDI2OQpzYmEoaW5vZS5zdXJ2ZXkyLnRyZWVzdXJ2ZXkKVHJlZUFuc3dlckNob2ljZQpwMjcwCihkcDI3MQpnNDEKUydETiBTYWZhcmljb20gTW9iaWxlIEFwcCcKcDI3MgpzZzQzCihscDI3MwpzYmEoaW5vZS5zdXJ2ZXkyLnRyZWVzdXJ2ZXkKVHJlZUFuc3dlckNob2ljZQpwMjc0CihkcDI3NQpnNDEKUydPdGhlcicKcDI3NgpzZzQzCihscDI3NwpzYmFzZzYKZzEKc2cxMQpOc2c2NQpJMDEKc2c5ClMnMScKc2JhZzEyMQphZzEyOQphZzE2NQphZzE3MwphZzE4MAphZzE5MgphZzQKYXNTJ2N1cnJlbnRRdWVzdGlvbicKcDI3OApnNApzUydzZW5kRW5kTWVzc2FnZScKcDI3OQpJMDEKc1MnY2FuU2VuZEVuZE1lc3NhZ2UnCnAyODAKSTAxCnNTJ2Nob2ljZVF1ZXVlJwpwMjgxCihscDI4MgpzYi4='

(这是实际输出的片段)

>>> y = x.myObject 
>>> type(y)
<type 'unicode'>

因此我无法访问实例方法。当我从 1.7 开始检查对象的属性时,我得到

>>> dir(y)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'islower', 'isnumeric', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

这是我的模型:

from django.db import models
from django.contrib.auth.models import User
from SerializedDataField import SerializedDataFiel

class MyModel(models.Model):

    title = models.TextField()
    description = models.TextField()
    creator = models.ForeignKey(User)
    created = models.DateTimeField(auto_now_add = True)
    code = models.TextField()
    active = models.BooleanField(default = None)

    """Pickled fresh survey object."""
    myObject = SerializedDataField()

    """Can the pickled surveyObj be changed? Once a survey has been activated, myObject cannot be changed"""
    mutable = models.BooleanField(default = None)      

    def __unicode__(self):
        return self.title + " (" + self.code + ")"

这是序列化数据字段

from django.db import models
try:
    import cPickle as pickle
except:
    import pickle

import base64

class SerializedDataField(models.TextField):
    """Because Django for some reason feels its needed to repeatedly call
    to_python even after it's been converted this does not support strings."""
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if value is None: return 
        if not isinstance(value, basestring): return value
        try:
            value = pickle.loads(base64.b64decode(value))
            return value
        except:
            return value

    def get_db_prep_save(self, value *args, **kwargs):
        if value is None: return 
        return base64.b64encode(pickle.dumps(value))

如果我不断获取 unicode 对象,如何访问我的实例方法?

最佳答案

Django 中的

所有文本列都存储为 Unicode 数据。如果您的列确实是二进制数据,您现在可以将它们迁移到 BinaryField (该字段仅在 Django 1.6 中添加)。

对于现有数据,您需要编码回二进制字节字符串,可以使用 Latin-1 (ISO 8859-1) 来执行此操作编解码器; Unicode 代码点 U+0000 到 U+00FF 一对一映射到 Latin-1 字节:

y = x.surveyObject.encode('latin1')

当时的错误是将二进制数据视为文本;它从一开始就不是文本。

关于python - 升级到 django 1.7 - 实例变为 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27172960/

相关文章:

python - 如何生成给定范围内的随机数作为 Tensorflow 变量

python - 如何在 Django 中添加链接预览?

django - 如何在 Django 中返回 HTTP 400 响应?

django - 在 django 模板中迭代用户

c# - 在 C# 控件中使用 Unicode 字符

linux - 尾部格式化错误

unicode - Python 3是使用sys.stdout.buffer.write()好的样式吗?

python - 带有 Python "Table has X columns but Y were supplied"的 SQLite

python - 如何找到旋转角度,使两点的Y轴相同

python - 将 Queryset 从装饰器传递给函数