对 peewee 字段类型进行子类化以添加行为
sub-classing a peewee field type to add behavior
我正在尝试将所需的行为添加到 CharFiled
或 TextField
中,以便我可以存储列表列表并再次将其检索为列表列表。我不是在寻求解决方案,而是希望看到一个示例,其中已完成对已支持字段类型的子类化,因为我在文档或 Internet 中找不到任何内容。
我是否必须按照创建自定义类型的文档中的说明进行操作?
例如:
class mylistoflists(TextField):
如果是,那么我必须分配给 field_type
什么?
示例代码(完整示例参见 tests/fields.py):
class ListField(TextField):
def db_value(self, value):
return ','.join(value) if value else ''
def python_value(self, value):
return value.split(',') if value else []
class Todo(TestModel):
content = TextField()
tags = ListField()
class TestCustomField(ModelTestCase):
requires = [Todo]
def test_custom_field(self):
t1 = Todo.create(content='t1', tags=['t1-a', 't1-b'])
t2 = Todo.create(content='t2', tags=[])
t1_db = Todo.get(Todo.id == t1.id)
self.assertEqual(t1_db.tags, ['t1-a', 't1-b'])
t2_db = Todo.get(Todo.id == t2.id)
self.assertEqual(t2_db.tags, [])
t1_db = Todo.get(Todo.tags == Value(['t1-a', 't1-b'], unpack=False))
self.assertEqual(t1_db.id, t1.id)
我正在尝试将所需的行为添加到 CharFiled
或 TextField
中,以便我可以存储列表列表并再次将其检索为列表列表。我不是在寻求解决方案,而是希望看到一个示例,其中已完成对已支持字段类型的子类化,因为我在文档或 Internet 中找不到任何内容。
我是否必须按照创建自定义类型的文档中的说明进行操作?
例如:
class mylistoflists(TextField):
如果是,那么我必须分配给 field_type
什么?
示例代码(完整示例参见 tests/fields.py):
class ListField(TextField):
def db_value(self, value):
return ','.join(value) if value else ''
def python_value(self, value):
return value.split(',') if value else []
class Todo(TestModel):
content = TextField()
tags = ListField()
class TestCustomField(ModelTestCase):
requires = [Todo]
def test_custom_field(self):
t1 = Todo.create(content='t1', tags=['t1-a', 't1-b'])
t2 = Todo.create(content='t2', tags=[])
t1_db = Todo.get(Todo.id == t1.id)
self.assertEqual(t1_db.tags, ['t1-a', 't1-b'])
t2_db = Todo.get(Todo.id == t2.id)
self.assertEqual(t2_db.tags, [])
t1_db = Todo.get(Todo.tags == Value(['t1-a', 't1-b'], unpack=False))
self.assertEqual(t1_db.id, t1.id)