Django自定义模型字段未保存到数据库。产生转义错误

时间:2019-04-26 21:02:06

标签: django python-3.x database django-models

我正在创建一个自定义模型字段,到目前为止,我已经复制了给定文档的相同代码示例。使用该示例,我可以在运行迁移后在数据库中创建一列,但是当我尝试将对象保存在数据库中时,我会得到

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时出现错误。

0 个答案:

没有答案