我对某些模型进行查询,并从生成的queryset对象返回一个评估列表。
此模型中的一个字段是包含json字符串的文本字段。我想根据json中键的值对类型列表进行排序。
示例JSON:
meta_data = "{'V1': {
'key': key,
'timestamp': timestamp,
'current': True,
'conversion_type': conversion_type,
'filename': filename},
'V2': {
'key': key,
'timestamp': timestamp,
'current': False,
'conversion_type': conversion_type,
'filename': filename},
'notes': []}"
键/值对是A.)带有键,时间戳等的版本(V1,V2等)或B.)注释。我需要忽略这些注释,找到带有current = True的版本,并使用该版本的时间戳进行排序。
我正在尝试这个:
def get_version_created_time(meta_data):
meta_data = json.loads(meta_data)
for key, value in meta_data.iteritems():
try:
if value['current'] == True:
return value['timestamp']
except KeyError:
pass
list_of_models.sort(key=get_version_created_time(operator.attrgetter('meta_data')))
但我的函数需要一个字符串,而operator.attrgetter('meta_data')不是字符串。我应该如何获取meta_data字段json字符串,因此我可以将其传递给我的函数以查找当前版本的时间戳,或者以我所描述的方式对模型列表进行排序的正确方法。
谢谢,
答案 0 :(得分:0)
这是解决方案:我的函数作为排序键传递,只需要假设正确的参数类型,这是一个模型,并调用Django的model_to_dict,这样我就可以将json拉出字段并查看通过它获得我想要的价值。
def get_version_created_time(item):
u = model_to_dict(item)
meta_data = json.loads(u['meta_data'])
for key, value in meta_data.iteritems():
try:
if value['current'] == True:
return value['timestamp']
except TypeError:
pass
res_sorted = sorted(res, key=get_version_created_time, reverse=True)