gpt4 book ai didi

Django自定义字段: Only run to_python() on values from DB?

转载 作者:行者123 更新时间:2023-12-04 08:16:10 24 4
gpt4 key购买 nike

如何确保仅在从数据库加载字段中的数据时才调用自定义字段的* to_python()*方法?

我正在尝试使用“自定义字段”来处理单个模型属性的Base64编码/解码。直到我实例化了模型的新实例并将此属性设置为其纯文本值,一切似乎都正常工作了……那时,Django尝试对字段进行解码,但由于它是纯文本而失败。

Custom Field实现的魅力在于,我认为我可以在那里处理100%的编码/解码逻辑,因此我的代码的其他部分都不需要了解它。我究竟做错了什么?

(注意:这仅是说明我的问题的示例,我不需要有关如何或不应该使用Base64编码的建议)

def encode(value):
return base64.b64encode(value)

def decode(value):
return base64.b64decode(value)


class EncodedField(models.CharField):
__metaclass__ = models.SubfieldBase

def __init__(self, max_length, *args, **kwargs):
super(EncodedField, self).__init__(*args, **kwargs)

def get_prep_value(self, value):
return encode(value)

def to_python(self, value):
return decode(value)

class Person(models.Model):
internal_id = EncodedField(max_length=32)

...并且在交互式shell中执行此操作时会中断。为什么在这里调用to_python()?
>>> from myapp.models import *
>>> Person(internal_id="foo")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 330, in __init__
setattr(self, field.attname, val)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/subclassing.py", line 98, in __set__
obj.__dict__[self.field.name] = self.field.to_python(value)
File "../myapp/models.py", line 87, in to_python
return decode(value)
File "../myapp/models.py", line 74, in decode
return base64.b64decode(value)
File "/usr/lib/python2.6/base64.py", line 76, in b64decode
raise TypeError(msg)
TypeError: Incorrect padding

我以为我可以做这样的事情...
>>> from myapp.models import *
>>> obj = Person(internal_id="foo")
>>> obj.internal_id
'foo'
>>> obj.save()
>>> newObj = Person.objects.get(internal_id="foo")
>>> newObj.internal_id
'foo'
>>> newObj.internal_id = "bar"
>>> newObj.internal_id
'bar'
>>> newObj.save()

...我在做什么错?

最佳答案

首次为该字段分配值时,是否仅获得TypeError?您可以编写一个try/except:

def to_python(self, value):
try:
return decode(value)
except TypeError:
return value

这不是最干净的解决方案,但是您可以尝试一下,看看它是否可以使您按照预期的方式进行现场工作。

关于Django自定义字段: Only run to_python() on values from DB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com