2017-02-03 8 views
0

出力時にデータの「キー」を変更する必要があります。数値の中にPythonキーの名前を動的に変更

これは、ジャンゴがこれを行うことができるかどうかわかりません。 FWIW、これは弾性検索に出力されます(関連性があるかどうかはわかりません)。

基本的には{"level":1 }となりますが、代わりに{"level_1":1}としたいと思います。

これはどのように達成できますか?

[ 
    { 
     "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 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) 

です

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

のようないくつかのテストデータとそれを実行するとreturn format_dict(obj.to_dict(include_meta=True))

は、少なくともこの作品あなたのコードでそれを使ってどのようにちょうど新しいの追加についてキーの名前を変更するのではなく、辞書のキー? –

+0

私が使用しているsearchkitライブラリはkeynamesしか見ないので。 – 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 

は、その後、私はそう

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

+0

このコードは私のmodels.pyに属していますが、def indexing関数を置き換えるのはどこですか?私は完全性のために私のsearch.py​​を追加しました – Ycon

+0

あなたの答えは動作しません。それは "level_1"と読みます。私は私の答え、 "注釈"を使用して試行を更新しました。もう一度お試しください。 – Ycon

関連する問題