我正在创建一个自定义模型字段,到目前为止,我已经复制了给定文档的相同代码示例。使用该示例,我可以在运行迁移后在数据库中创建一列,但是当我尝试将对象保存在数据库中时,我会得到
TypeError: can't escape str to binary
我假设给定的docs示例可以毫无问题地运行,并且我可以自定义它,但是即使包括了所有未运行的docs资料。
Portion of The Error
return executor(sql, params, many, context)
File "/home/vikram/python-virtual-environments/project/lib/python
3.6/site-packages/django/db/backends/utils.py", line 85,
in _execute
return self.cursor.execute(sql, params)
TypeError: can't escape str to binary
模型
class test(models.Model):
a = HandField()
CustomField类
从django.db导入模型 汇入
手牌: “”“手牌(桥梁风格)”“”
def __init__(self, north, east, south, west):
# Input parameters are lists of cards ('Ah', '9s', etc.)
self.north = north
self.east = east
self.south = south
self.west = west
def parse_hand(hand_string):
"""Takes a string of cards and splits into a full hand."""
p1 = re.compile('.{26}')
p2 = re.compile('..')
args = [p2.findall(x) for x in p1.findall(hand_string)]
if len(args) != 4:
raise ValidationError(_("Invalid input for a Hand instance"))
return Hand(*args)
HandField类(models.Field):
description = "A hand of cards (bridge style)"
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 104
super().__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
del kwargs["max_length"]
return name, path, args, kwargs
def from_db_value(self, value, expression, connection):
if value is None:
return value
return parse_hand(value)
def to_python(self, value):
if isinstance(value, Hand):
return value
if value is None:
return value
return parse_hand(value)
def get_prep_value(self, value):
return ''.join([''.join(l) for l in (value.north,
value.east, value.south, value.west)])
def get_db_prep_value(self, value, connection, prepared=False):
value = super().get_db_prep_value(value, connection, prepared)
if value is not None:
return connection.Database.Binary(value)
return value
def get_internal_type(self):
return 'CharField'
def value_to_string(self, obj):
value = self.value_from_object(obj)
return self.get_prep_value(value)
在该模型上调用save时出现错误。