ユーザーが辞書を渡すことができるカスタム フィールドを作成しました。この辞書は、データベースに文字列として保存されます。これが私の 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 |
+----+--------+
2 回目の保存では、上記が次のように変更されます。
+----+--------+
| 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/