我试图请求一个json对象并使用for循环在对象中运行,并取出我需要的数据并将其保存到django中的一个模型中。
我只想要runner_1_name和runner_2_name的前两个属性,但是在json对象中,每个列表中的数量或运行程序不同。我一直在让列表索引超出范围误差。我尝试过使用“尝试并接受”,但是当我尝试保存到模型时,它显示了在赋值之前引用了我的保存变量,那么忽略列表、索引输出或范围错误或修正列表的最佳方式是什么,以便索引是正确的?我还希望代码运行得非常快,因为我将使用这个函数作为后台任务,每两秒钟轮询一次。
@shared_task()
def mb_get_events():
mb = APIClient('username' , 'pass')
tennis_events = mb.market_data.get_events()
for data in tennis_events:
id = data['id']
event_name = data['name']
sport_id = data['sport-id']
start_time = data['start']
is_ip = data['in-running-flag']
par = data['event-participants']
event_id = par[0]['event-id']
cat_id = data['meta-tags'][0]['id']
cat_name = data['meta-tags'][0]['name']
cat_type = data['meta-tags'][0]['type']
url_name = data['meta-tags'][0]['type']
try:
runner_1_name = data['markets'][0]['runners'][0]['name']
except IndexError:
pass
try:
runner_2_name = data['markets'][0]['runners'][1]['name']
except IndexError:
pass
run1_par_id = data['markets'][0]['runners'][0]['id']
run2_par_id = data['markets'][0]['runners'][1]['id']
run1_back_odds = data['markets'][0]['runners'][0]['prices'][0]['odds']
run2_back_odds = data['markets'][0]['runners'][1]['prices'][0]['odds']
run1_lay_odds = data['markets'][0]['runners'][0]['prices'][3]['odds']
run2_lay_odds = data['markets'][0]['runners'][1]['prices'][3]['odds']
te, created = MBEvent.objects.update_or_create(id=id)
te.id = id
te.event_name = event_name
te.sport_id = sport_id
te.start_time = start_time
te.is_ip = is_ip
te.event_id = event_id
te.runner_1_name = runner_1_name
te.runner_2_name = runner_2_name
te.run1_back_odds = run1_back_odds
te.run2_back_odds = run2_back_odds
te.run1_lay_odds = run1_lay_odds
te.run2_lay_odds = run2_lay_odds
te.run1_par_id = run1_par_id
te.run2_par_id = run2_par_id
te.cat_id = cat_id
te.cat_name = cat_name
te.cat_type = cat_type
te.url_name = url_name
te.save()发布于 2019-01-17 13:14:06
快速修复:
try:
runner_1_name = data['markets'][0]['runners'][0]['name']
except IndexError:
runner_1_name = '' # don't just pass here
try:
runner_2_name = data['markets'][0]['runners'][1]['name']
except IndexError:
runner_2_name = ''它为您提供了variables is referenced before assignment,因为在expect块中,您只是在传递,所以如果尝试失败,runner_1_name或runner_2_name永远不会被定义。当您尝试使用这些变量时,会得到一个错误,因为它们从未被定义过。因此,在set块中,要么将值设置为空字符串,要么将其他字符串设置为'Runner Does not Exists'。
现在,如果您想完全避免尝试/除和IndexError,可以使用if语句来检查markets和runners的长度。就像这样:
runner_1_name = ''
runner_2_name = ''
# Make sure markets exists in data and its length is greater than 0 and runners exists in first market
if 'markets' in data and len(data['markets']) > 0 and 'runners' in data['market'][0]:
runners = data['markets'][0]['runners']
# get runner 1
if len(runners) > 0 and `name` in runners[0]:
runner_1_name = runners[0]['name']
else:
runner_1_name = 'Runner 1 does not exists'
# get runner 2
if len(runners) > 1 and `name` in runners[1]:
runner_2_name = runners[1]['name']
else:
runner_2_name = 'Runner 2 does not exists'正如你所看到的,这样的时间太长了,这并不是做事情的推荐方法。
您应该假设数据是正常的,并尝试获取名称并使用try /除捕获前面第一个代码片段中建议的任何错误之外。
发布于 2019-12-11 09:19:53
我有一个评论列表的问题,这些评论可以是空的,也可以是由数量未知的评论填充的。
我的解决方案是在0处初始化一个计数变量,并在循环中的一个布尔值上有一个while循环,如果它失败了,我尝试得到注释计数,除了IndexError,我将布尔值设置为False以停止无限循环。
count = 0
condition_continue = True
while condition_continue :
try:
detailsCommentDict = comments[count]
....
except IndexError:
# no comment at all or no more comment
condition_continue = False https://stackoverflow.com/questions/54236043
复制相似问题