Python Django,如何迭代不同长度的一对多字段
我是Django的新手,我正在尝试创建一个应用程序来显示网球比赛结果。到目前为止,出乎我的意料,我已经设法拼凑出一些有效的代码 然而,我现在有一个问题,尽管目前我想在一个模板中列出匹配项及其分数,但是每个匹配项的集合数量可能不同,当我迭代它们时,我会得到一个索引错误。有些比赛可能有2盘,其他的3盘、4盘或5盘。。。如果一名球员退役,也许有些球员甚至只有1名 我有比赛和每场比赛的模型,就像这样。(我可以获得比赛日期、比赛、结果和Set1等,以便玩家显示,因为这些列表都具有相同数量的值。但是,set3的列表长度作为示例要短得多,并且会导致错误。): 型号.pyPython Django,如何迭代不同长度的一对多字段,python,django,Python,Django,我是Django的新手,我正在尝试创建一个应用程序来显示网球比赛结果。到目前为止,出乎我的意料,我已经设法拼凑出一些有效的代码 然而,我现在有一个问题,尽管目前我想在一个模板中列出匹配项及其分数,但是每个匹配项的集合数量可能不同,当我迭代它们时,我会得到一个索引错误。有些比赛可能有2盘,其他的3盘、4盘或5盘。。。如果一名球员退役,也许有些球员甚至只有1名 我有比赛和每场比赛的模型,就像这样。(我可以获得比赛日期、比赛、结果和Set1等,以便玩家显示,因为这些列表都具有相同数量的值。但是,set
class Match(models.Model):
match_ID = models.AutoField(primary_key=True)
match_date = models.DateField()
players = models.ManyToManyField(Team, through='MatchStats', related_name='pim')
hometeam = models.ForeignKey(Team, to_field='teamname', related_name='hometeam')
awayteam = models.ForeignKey(Team, to_field='teamname', related_name='awayteam')
hometeam_sets = models.IntegerField()
awayteam_sets = models.IntegerField()
class Set(models.Model):
set_ID = models.AutoField(primary_key=True)
match = models.ForeignKey(Match)
set_number = models.IntegerField()
hometeam_games = models.IntegerField(default=0)
awayteam_games = models.IntegerField(default=0)
def playermatches(request, player_ID):
context = RequestContext(request)
p = get_object_or_404(Player, pk=player_ID)
match_list = Match.objects.filter(players=player_ID).order_by('-match_date')[:100]
i = len(match_list)
j = 0
#This works as all test matches have a 1st set!
s1_list = Set.objects.filter(match=match_list, set_number=1).order_by(-match__match_date')[:100]
"""
I am totally out of ideas as to what I might do next though.
Tried various things like 'if exists', 'try except IndexError etc'.
Below was the last thing I tried which failed yet again.
"""
s3_list = []
while j < i:
s3 = Set.objects.filter(match=match_list, set_number=3)[j]
if s3:
s3_list.append(s2)
else:
s3 = Set.objects.filter(set_ID=1)
s3_list.append(s3)
lst1 = match_list
lst2 = result_list
lst3 = s1_list
...
lst5 = s3_list
mandr = zip(lst1, lst2, lst3,... lst5)
context_dict = {...}
return render_to_response('stats/players.html', context_dict, context)
m_list = match_list
r_list = result_list
list1 = s1_list
list2 = s2_list
..............
list5 = s3_list
mandr = zip(m_list, r_list)
my_lists = zip(list1, list2, ..., lst5)
{% if matches %}
<ul>
{% for match, team in mandr %}
<li>{{ match.match_date }} <a href="/stats/match/{{ match.match_ID }}/">
{{ match.hometeam }} vs. {{ match.awayteam }}</a> ( {{ team.result }} )</li>
<li>{{ match.hometeam_sets }}:{{ match.awayteam_sets }} --
{% for lst in my_lists %}
<li>{{ lst.hometeam_games }}</li>
{% endfor %}
{% endfor %}
</ul>
{% else %}
<br/>
<strong>There are currently no matches in the system - try again tomorrow!</strong>
{% endif %}
视图.py
class Match(models.Model):
match_ID = models.AutoField(primary_key=True)
match_date = models.DateField()
players = models.ManyToManyField(Team, through='MatchStats', related_name='pim')
hometeam = models.ForeignKey(Team, to_field='teamname', related_name='hometeam')
awayteam = models.ForeignKey(Team, to_field='teamname', related_name='awayteam')
hometeam_sets = models.IntegerField()
awayteam_sets = models.IntegerField()
class Set(models.Model):
set_ID = models.AutoField(primary_key=True)
match = models.ForeignKey(Match)
set_number = models.IntegerField()
hometeam_games = models.IntegerField(default=0)
awayteam_games = models.IntegerField(default=0)
def playermatches(request, player_ID):
context = RequestContext(request)
p = get_object_or_404(Player, pk=player_ID)
match_list = Match.objects.filter(players=player_ID).order_by('-match_date')[:100]
i = len(match_list)
j = 0
#This works as all test matches have a 1st set!
s1_list = Set.objects.filter(match=match_list, set_number=1).order_by(-match__match_date')[:100]
"""
I am totally out of ideas as to what I might do next though.
Tried various things like 'if exists', 'try except IndexError etc'.
Below was the last thing I tried which failed yet again.
"""
s3_list = []
while j < i:
s3 = Set.objects.filter(match=match_list, set_number=3)[j]
if s3:
s3_list.append(s2)
else:
s3 = Set.objects.filter(set_ID=1)
s3_list.append(s3)
lst1 = match_list
lst2 = result_list
lst3 = s1_list
...
lst5 = s3_list
mandr = zip(lst1, lst2, lst3,... lst5)
context_dict = {...}
return render_to_response('stats/players.html', context_dict, context)
m_list = match_list
r_list = result_list
list1 = s1_list
list2 = s2_list
..............
list5 = s3_list
mandr = zip(m_list, r_list)
my_lists = zip(list1, list2, ..., lst5)
{% if matches %}
<ul>
{% for match, team in mandr %}
<li>{{ match.match_date }} <a href="/stats/match/{{ match.match_ID }}/">
{{ match.hometeam }} vs. {{ match.awayteam }}</a> ( {{ team.result }} )</li>
<li>{{ match.hometeam_sets }}:{{ match.awayteam_sets }} --
{% for lst in my_lists %}
<li>{{ lst.hometeam_games }}</li>
{% endfor %}
{% endfor %}
</ul>
{% else %}
<br/>
<strong>There are currently no matches in the system - try again tomorrow!</strong>
{% endif %}
def播放器匹配(请求,播放器ID):
context=RequestContext(请求)
p=获取对象或404(玩家,pk=玩家ID)
match_list=match.objects.filter(players=player_ID)。排序依据('-match_date')[:100]
i=len(匹配列表)
j=0
#这是因为所有测试赛都有第一组!
s1\u list=Set.objects.filter(match=match\u list,Set\u number=1)。排序依据(-match\u match\u date')[:100]
"""
我完全不知道我下一步会做什么。
尝试了各种方法,如“如果存在”、“尝试除索引器之外的其他方法”等。
下面是我最后一次尝试,但再次失败。
"""
s3_列表=[]
而j
template.html
{% if matches %}
<ul>
{% for match, team, s1, s2 in mandr %}
<li>{{ match.match_date }} <a href="/stats/match/{{ match.match_ID }}/">{{ match.hometeam }} vs. {{ match.awayteam }}</a> ( {{ team.result }} )</li>
<li>{{ match.hometeam_sets }}:{{ match.awayteam_sets }} -- {{ s1.hometeam_games }}-{{ s1.awayteam_games }} {{ s3.hometeam_games }}-{{ s3.awayteam_games }}</li>
{% endfor %}
</ul>
{% else %}
<br/>
<strong>There are currently no matches in the system - try again tomorrow!</strong>
{% endif %}
{%if匹配%}
{%用于比赛,团队,s1,s2在mandr%}
- {{match.match_date}}({{team.result}})
- {match.hometeam\u sets}:{{match.awayteam\u sets}--{s1.hometeam\u games}-{s1.awayteam\u games}{{s3.hometeam\u games}-{s3.awayteam\u games}
{%endfor%}
{%else%}
系统中当前没有匹配项-请明天再试强>
{%endif%}
不要将匹配列表、结果列表与剩余列表混用。在视图中将它们作为单独的对象传递,并在模板中对它们进行迭代
按如下所示更改视图和模板
视图.py
class Match(models.Model):
match_ID = models.AutoField(primary_key=True)
match_date = models.DateField()
players = models.ManyToManyField(Team, through='MatchStats', related_name='pim')
hometeam = models.ForeignKey(Team, to_field='teamname', related_name='hometeam')
awayteam = models.ForeignKey(Team, to_field='teamname', related_name='awayteam')
hometeam_sets = models.IntegerField()
awayteam_sets = models.IntegerField()
class Set(models.Model):
set_ID = models.AutoField(primary_key=True)
match = models.ForeignKey(Match)
set_number = models.IntegerField()
hometeam_games = models.IntegerField(default=0)
awayteam_games = models.IntegerField(default=0)
def playermatches(request, player_ID):
context = RequestContext(request)
p = get_object_or_404(Player, pk=player_ID)
match_list = Match.objects.filter(players=player_ID).order_by('-match_date')[:100]
i = len(match_list)
j = 0
#This works as all test matches have a 1st set!
s1_list = Set.objects.filter(match=match_list, set_number=1).order_by(-match__match_date')[:100]
"""
I am totally out of ideas as to what I might do next though.
Tried various things like 'if exists', 'try except IndexError etc'.
Below was the last thing I tried which failed yet again.
"""
s3_list = []
while j < i:
s3 = Set.objects.filter(match=match_list, set_number=3)[j]
if s3:
s3_list.append(s2)
else:
s3 = Set.objects.filter(set_ID=1)
s3_list.append(s3)
lst1 = match_list
lst2 = result_list
lst3 = s1_list
...
lst5 = s3_list
mandr = zip(lst1, lst2, lst3,... lst5)
context_dict = {...}
return render_to_response('stats/players.html', context_dict, context)
m_list = match_list
r_list = result_list
list1 = s1_list
list2 = s2_list
..............
list5 = s3_list
mandr = zip(m_list, r_list)
my_lists = zip(list1, list2, ..., lst5)
{% if matches %}
<ul>
{% for match, team in mandr %}
<li>{{ match.match_date }} <a href="/stats/match/{{ match.match_ID }}/">
{{ match.hometeam }} vs. {{ match.awayteam }}</a> ( {{ team.result }} )</li>
<li>{{ match.hometeam_sets }}:{{ match.awayteam_sets }} --
{% for lst in my_lists %}
<li>{{ lst.hometeam_games }}</li>
{% endfor %}
{% endfor %}
</ul>
{% else %}
<br/>
<strong>There are currently no matches in the system - try again tomorrow!</strong>
{% endif %}
模板.py
class Match(models.Model):
match_ID = models.AutoField(primary_key=True)
match_date = models.DateField()
players = models.ManyToManyField(Team, through='MatchStats', related_name='pim')
hometeam = models.ForeignKey(Team, to_field='teamname', related_name='hometeam')
awayteam = models.ForeignKey(Team, to_field='teamname', related_name='awayteam')
hometeam_sets = models.IntegerField()
awayteam_sets = models.IntegerField()
class Set(models.Model):
set_ID = models.AutoField(primary_key=True)
match = models.ForeignKey(Match)
set_number = models.IntegerField()
hometeam_games = models.IntegerField(default=0)
awayteam_games = models.IntegerField(default=0)
def playermatches(request, player_ID):
context = RequestContext(request)
p = get_object_or_404(Player, pk=player_ID)
match_list = Match.objects.filter(players=player_ID).order_by('-match_date')[:100]
i = len(match_list)
j = 0
#This works as all test matches have a 1st set!
s1_list = Set.objects.filter(match=match_list, set_number=1).order_by(-match__match_date')[:100]
"""
I am totally out of ideas as to what I might do next though.
Tried various things like 'if exists', 'try except IndexError etc'.
Below was the last thing I tried which failed yet again.
"""
s3_list = []
while j < i:
s3 = Set.objects.filter(match=match_list, set_number=3)[j]
if s3:
s3_list.append(s2)
else:
s3 = Set.objects.filter(set_ID=1)
s3_list.append(s3)
lst1 = match_list
lst2 = result_list
lst3 = s1_list
...
lst5 = s3_list
mandr = zip(lst1, lst2, lst3,... lst5)
context_dict = {...}
return render_to_response('stats/players.html', context_dict, context)
m_list = match_list
r_list = result_list
list1 = s1_list
list2 = s2_list
..............
list5 = s3_list
mandr = zip(m_list, r_list)
my_lists = zip(list1, list2, ..., lst5)
{% if matches %}
<ul>
{% for match, team in mandr %}
<li>{{ match.match_date }} <a href="/stats/match/{{ match.match_ID }}/">
{{ match.hometeam }} vs. {{ match.awayteam }}</a> ( {{ team.result }} )</li>
<li>{{ match.hometeam_sets }}:{{ match.awayteam_sets }} --
{% for lst in my_lists %}
<li>{{ lst.hometeam_games }}</li>
{% endfor %}
{% endfor %}
</ul>
{% else %}
<br/>
<strong>There are currently no matches in the system - try again tomorrow!</strong>
{% endif %}
{%if匹配%}
{对于比赛,团队在mandr%}
- {{match.match_date}}({{team.result}})
- {{match.hometeam_set}}:{{match.awayteam_set}--
{我的_列表中的lst的%s%}
- {{lst.hometeam_games}
{%endfor%}
{%endfor%}
{%else%}
系统中当前没有匹配项-请明天再试强>
{%endif%}
最后不需要太花哨的东西。意识到我需要通过外键查找每个匹配的相关集合。。。然后简单地迭代模板中的内容
{% for match in mandr %}
{% for set in match.sets.all %}
{{ set.hometeam_games }}:{{ set.awayteam_games }}
{% endfor %}
{% endfor %}
非常感谢。不完全是我想要的,但帮助我看到我正朝着完全错误的方向努力。