在值内动态重命名python键

时间:2017-02-03 17:02:29

标签: python django

我需要在输出时更改数据的“关键字”。

我不确定django是否可以这样做。 FWIW,这输出到弹性搜索(不确定是否相关)。

基本上它出现在{"level":1 }但我希望它代之以{"level_1":1}

如何实现这一目标?这是我目前的代码

class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    level = models.IntegerField(null=True, blank=True)

class Entry(models.Model):
    title = models.CharField("Title", max_length=10000, blank=True)
    tag = models.ManyToManyField('Tag', blank=True)
    def indexing(self):
        obj = TaskIndex(
            meta={'id': self.id},
            title=self.title,
            tag=list(self.tag.values('name').annotate(level=F('level_%)))
        )
        obj.save()
        return obj.to_dict(include_meta=True)

结果如何:

[  
   {  
      "title":"Test item",
      "tag":[  
         {  
            "name":"Nope",
            "level":1
         },
         {  
            "name":"Yep",
            "level":2
         }
      ],
   }
]

我希望结果如何:

[  
   {  
      "title":"Test item",
      "tag":[  
         {  
            "name":"Nope",
            "level_1":1
         },
         {  
            "name":"Yep",
            "level_2":2
         }
      ],
   }
]

Search.py​​

class TaskIndex(DocType):
    title = String()
    class Meta:
        index = 'task-index'

# Bulk indexing function, run in shell
def bulk_indexing():
    TaskIndex.init()
    es = Elasticsearch()
    bulk(client=es, actions=(b.indexing() for b in models.Task.objects.all().iterator()))

# Simple search function
def _search(title):
    s = Search().filter('term', title=title.text)
    response = s.execute()
    return response

1 个答案:

答案 0 :(得分:0)

我不熟悉弹性搜索或你正在进行的索引功能,但也许某种功能可以格式化数据呢?

def format_dict(data):
    for obj in data:
        new_tags = []
        for tag in obj.get('tag', []):
            level_number = tag['level']
            tag.pop('level')
            tag['level_%s' % level_number] = level_number
            new_tags.append(tag)
        obj['tag'] = new_tags
    return data

然后在你的代码中使用它

return format_dict(obj.to_dict(include_meta=True))

至少当我用一些像这样的测试数据运行它时,这个工作

print(format_dict([{"title": "Test item", "tag": [{"name": "Nope", "level": 1}, {"name": "Yep", "level": 2}], }]))