2017-02-03 69 views
0

的內部動態的關鍵,我需要改變我的數據的「關鍵」,當它輸出。重命名蟒蛇值

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

回答

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

+0

此代碼屬於哪裏?在我的models.py中替換def索引函數?我已添加完整的search.py​​ – Ycon

+0

您的答案無效。它應該是「level_1」。我已經更新了我的答案,嘗試使用「註釋」。你可以再試一次嗎? – Ycon