这是我的数据样本:
Network Policy
Level 1: John Smith
Start date: 27 April
Start time: 8am
end Date: 05 May
end time: 8am
Level 2: Bob Smith
Start date: 27 April
Start time: 8am
end Date: 05 May
end time: 8am
Server Policy
Level 1: Jane Doe
Start date: 23 April
Start time: 8am
end Date: 02 May
end time: 8am
Level 2: Greg Brad
Start date: 23 April
Start time: 8am
end Date: 02 May
end time: 8am
我需要以这样一种格式安排这些数据,以便我可以将其用作 django 中的模板。一开始我以为我需要嵌套字典,但这行不通,因为我需要同一个键下的多个值。
我是 Python 新手,所以如果我错了,请更正上面的内容。
编辑:
这是我得到的,
我有 Dict > list ,但不确定如何将匹配的字典放入列表中?
### Get all the Polices ###
dictContext = {}
for objPolicy in objPolicyData['escalation_policies']:
strPolicyName = objPolicy['name']
if strPolicyName.lower().find('test') == -1:
lstLevel = []
dictContext[strPolicyName] = lstLevel
for objOnCall in objPolicy['on_call']:
dictUser = {}
lstLevel.append(objOnCall['level'])
dictUser['strStartDate'] = getDate(objOnCall['start'])
dictUser['strStartTime'] = getTime(objOnCall['start'])
dictUser['strEndDate'] = getDate(objOnCall['end'])
dictUser['strEndTime'] = getTime(objOnCall['end'])
objUser = objOnCall['user']
dictUser['strUsername'] = objUser['name']
dictUser['strUserMobile'] = getUserMobile(objUser['id'])
#lstLevel.append(dictUser)
结果是
{
u'DBA Escalation Policy': [1],
u'Server Escalation Policy': [1],
u'Network Team Escalation Policy': [1, 2],
}
所以我的下一步是让每个级别下的用户详细信息
它需要去
Policy1 > Level 1 > level 1 user details | Level 2 > Level 2 user details
Policy2 > Level 1 > level 1 user details
Policy3 > Level 1 > level 1 user details | Level 2 > Level 2 user details | Level 3 > Level 3 user details
这是我的目标
谢谢
请您参考如下方法:
使用原始类型,您的数据可能会转换为如下内容:
policy = {
"Network": [
{
"Name": "John Smith",
"Start_date": "27 April",
"Start_time": "8am",
"end_Date": "05 May",
"end_time": "8am"
},
{
"Name": "Bob Smith",
"Start_date": "27 April",
"Start_time": "8am",
"end_Date": "05 May",
"end_time": "8am"
},
]
"Server": [
# ...
]
}
然后在django模板中,你可以引用,例如:
{% policy.Network.0.name %}
(级别从 0 开始,所以使用 level - 1)
您还可以遍历每个策略中的级别。
要从您已有的数据结构(根据您的代码示例判断)创建此数据结构,您需要执行以下操作:
policy = {}
# is there a better way here? Are we iterating a dict or a list?
for policy_data in objPolicyData['escalation_policies']:
policy_name = policy_data["name"]
# this is a better approach that the find method you employed
if "test" in policy_name:
continue
def sort_key(user_data):
return user_data["level"]
# just using a list comprehension to map the objects from the current
# form to your desired form, making sure we iterate over them in
# level order
policy[policy_name] = [
{
"name": user_data["name"]
"start_date": getDate(user_data['start'])
"start_time": getTime(user_data['start'])
"end_date": getDate(user_data['end'])
"end_time": getTime(user_data['end'])
}
for user_data in sorted(policy_data["on_call"], key=sort_key)
]
我可能会考虑让对象代表你的数据,并提供一个接口(interface)来处理 django 模板的限制,而不是使用原语,因为否则你最终会得到你的模板和你的 View 代码都紧密耦合到数据结构。
