重命名蟒蛇值

问题描述:

的内部动态的关键,我需要改变我的数据的“关键”,当它输出。重命名蟒蛇值

我不确定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

因为我使用的searchkit库只查看关键字。 – Ycon

我不熟悉弹性搜索或您正在执行的索引功能,但也许某种函数将格式化数据将执行?

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}], }]))

+0

此代码属于哪里?在我的models.py中替换def索引函数?我已添加完整的search.py​​ – Ycon

+0

您的答案无效。它应该是“level_1”。我已经更新了我的答案,尝试使用“注释”。你可以再试一次吗? – Ycon