Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在值的内部动态重命名python键_Python_Django - Fatal编程技术网

在值的内部动态重命名python键

在值的内部动态重命名python键,python,django,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=Tru

我需要在数据输出时更改其“键”

我不确定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
         }
      ],
   }
]
我希望结果的外观:

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

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

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(格式为dict([{“title”:“Test item”,“tag”:[{“name”:“Nope”,“level”:1},{“name”:“yes”,“level”:2}),}]))

将新密钥添加到字典中,而不是尝试重命名密钥,怎么样?因为我使用的searchkit库只查看密钥名。此代码属于何处-在my models.py中替换def索引功能?我已添加我的search.py for completeness your答案无效。应为“1级”。我更新了我的答案,尝试使用“注释”。你能再试一次吗?