当数据输出时,我需要更改数据的“键”。
我不确定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发布于 2017-02-03 17:35:08
我不熟悉弹性搜索或者你正在做的索引函数,但是也许是某种将格式化数据的函数呢?
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}], }]))
https://stackoverflow.com/questions/42029351
复制相似问题