python在json字段中按值排序django模型

时间:2015-09-22 23:25:48

标签: python json sorting django-models

我对某些模型进行查询,并从生成的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字符串,因此我可以将其传递给我的函数以查找当前版本的时间戳,或者以我所描述的方式对模型列表进行排序的正确方法。

谢谢,

1 个答案:

答案 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)