Python Django,如何迭代不同长度的一对多字段

Python Django,如何迭代不同长度的一对多字段,python,django,Python,Django,我是Django的新手,我正在尝试创建一个应用程序来显示网球比赛结果。到目前为止,出乎我的意料,我已经设法拼凑出一些有效的代码 然而,我现在有一个问题,尽管目前我想在一个模板中列出匹配项及其分数,但是每个匹配项的集合数量可能不同,当我迭代它们时,我会得到一个索引错误。有些比赛可能有2盘,其他的3盘、4盘或5盘。。。如果一名球员退役,也许有些球员甚至只有1名 我有比赛和每场比赛的模型,就像这样。(我可以获得比赛日期、比赛、结果和Set1等,以便玩家显示,因为这些列表都具有相同数量的值。但是,set

我是Django的新手,我正在尝试创建一个应用程序来显示网球比赛结果。到目前为止,出乎我的意料,我已经设法拼凑出一些有效的代码

然而,我现在有一个问题,尽管目前我想在一个模板中列出匹配项及其分数,但是每个匹配项的集合数量可能不同,当我迭代它们时,我会得到一个索引错误。有些比赛可能有2盘,其他的3盘、4盘或5盘。。。如果一名球员退役,也许有些球员甚至只有1名

我有比赛和每场比赛的模型,就像这样。(我可以获得比赛日期、比赛、结果和Set1等,以便玩家显示,因为这些列表都具有相同数量的值。但是,set3的列表长度作为示例要短得多,并且会导致错误。):

型号.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 %}
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 %}

非常感谢。不完全是我想要的,但帮助我看到我正朝着完全错误的方向努力。