我创建了一个自定义字段,允许用户传入字典。该字典在我的数据库中保存为字符串。这是我的 models.py 类的主要部分。
class OptionsField(models.Field):
description = 'All options'
#__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 2048
kwargs['unique'] = False
kwargs['null'] = True
super(OptionsField, self).__init__(*args, **kwargs)
def db_type(self, connection):
return 'varchar(2048)'
#Transforms database values to a python dictionary
def to_python(self, value):
if isinstance(value, dict):
return value
together = value.split(' \n')
returnDictionary = {}
for item in together:
dictionaryField = item.split(' : ')
returnDictionary[dictionaryField[0]] = dictionaryField[1]
return returnDictionary
#Transforms a python dictionary to database-compatible values (string)
def get_prep_value(self, dict):
databaseList = []
print dict
for key, value in dict.iteritems():
listValue = ' : '.join([str(key), str(value)])
databaseList.append(listValue)
databaseList.sort()
return ' \n'.join(databaseList)
-------------------------------END OF CUSTOM FIELD---------------------
class MyModel(models.Model):
options = OptionsField()
class Meta:
app_label = 'testingDB'
在我的主要内容中,我可以执行以下操作
dictionary = {'a':'b', 'c':'d'}
example = MyModel(options = dictionary)
example.save()
example.options['ZZ'] = 'z'
example.options['a'] = 'grr'
example.save()
第一次保存将以下内容放入数据库:
+----+--------+
| id | options|
+----+--------+
| 1 | a : b |
| | c : d |
+----+--------+
第二次保存将上述内容更改为:
+----+--------+
| id | options|
+----+--------+
| 1 | a : grr|
| | c : d |
| | ZZ : z |
+----+--------+
我如何在这个数据库中搜索呢?如果我做类似的事情
test=MyModel.objects.filter(options['a'] = 'b')
我得到了一个SyntaxError: Keyword can't be an expression
我假设我必须创建方法 get_prep_lookup,并且我已经尝试了很多东西,但它似乎不起作用。
文档:https ://docs.djangoproject.com/en/1.4/howto/custom-model-fields/