【问题标题】:Django mysql database display data from more than one table in a for loop in template problemDjango mysql数据库在模板问题的for循环中显示来自多个表的数据
【发布时间】:2021-08-12 00:25:09
【问题描述】:

我有一个从 2006 年开始使用 mysql 数据库的旧联盟网站 php 脚本。此脚本无法运行取决于旧 php 和 mysql 版本。这就是为什么我尝试使用 django 从 mysql 数据库中获取数据,但匹配列表页面出现问题。

在数据库中有一个联赛表。我可以像这样使用 django 模板系统获取数据和列表:

models.py

 class LeagueMatch(models.Model):
objects = None
idm = models.AutoField(primary_key=True)
league = models.IntegerField()
ids = models.PositiveIntegerField()
judge = models.PositiveIntegerField()
date = models.IntegerField()
idg = models.PositiveIntegerField(blank=True, null=True)
pos = models.IntegerField(blank=True, null=True)
rnd = models.PositiveIntegerField(blank=True, null=True)
idc1 = models.IntegerField()
idc2 = models.IntegerField()
type = models.CharField(max_length=20, blank=True, null=True)
idpt = models.PositiveSmallIntegerField()
points1 = models.IntegerField()
points2 = models.IntegerField()
frags1 = models.SmallIntegerField()
frags2 = models.SmallIntegerField()
win1 = models.PositiveIntegerField()
draw = models.PositiveIntegerField()
win2 = models.PositiveIntegerField()
maps = models.CharField(max_length=70)
scores = models.CharField(max_length=70)
descr = models.TextField()
server = models.CharField(max_length=30)

views.py

def all_matches(request):
match_list = LeagueMatch.objects.all()
return render(request, 'home_match.html',
              {'match_list': match_list})

{% for match in match_list reversed %}
{% if match.league == 1 %}
        <div class="card" >
              <div class="card-body">
                 <h5 class="card-title"><a href="{% url 'match-detail' match.pk %}"> Match  No {{ match.idm }} - Team A ({{ match.idc1 }}) vs Team B ({{ match.idc2 }})</a></h5>
                <p class="card-text"><b>Score : {{ match.win1 }} : {{ match.win2 }}</b></p>
              </div>
        </div>
        </br></br>
{% endif %}

{% endfor %}

league matches table

模板渲染结果如下:

所有匹配项

Match No 55 - Team A (9) vs Team B (7)

Score : 1 : 2


Match No 53 - Team A (9) vs Team B (2)

Score : 2 : 0

这没关系,但球队名称不在同一张表中(league_match),只有球队编号(idc1 和 idc2)。球队名称存储在另一个表名是league_clan。我想像这样显示所有匹配列表:

Match No 55 - Team A (team 9's name ) vs Team B (team 7'name)

Score : 1 : 2

我的意思是 idc1 == 9 我们将从其他表中获取数据 9 号团队的名称是什么并显示。我如何为此显示器编写模型或模板代码?我无法在 {% for %} 代码中做到这一点。有问题,求帮助。我希望解释一下谢谢。

teams table with names(tags)

【问题讨论】:

    标签: python mysql django django-models django-templates


    【解决方案1】:

    您好,谢谢,但遇到这样的错误:

    /matches/处的操作错误

    (1054, "'field list' 中的未知列 'league_match.idc1_id'")

    请求方法:GET 请求网址:http://localhost:8000/matches/ Django 版本:3.2.2 异常类型:操作错误 异常值:

    (1054, "'field list' 中的未知列 'league_match.idc1_id'")

    异常位置:/home/tolga/.local/lib/python3.8/site-packages/MySQLdb/connections.py,第 259 行,查询中 Python 可执行文件:/usr/bin/python3 Python版本:3.8.5 Python 路径:

    ['/home/tolga/q2ligi2006', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/tolga/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']

    服务器时间:2021 年 6 月 3 日星期四 09:16:13 +0000

    我用这样的 ForeignKey 字段更新了模型:

    class LeagueMatch(models.Model):
    objects = None
    idm = models.AutoField(primary_key=True)
    league = models.IntegerField()
    ids = models.PositiveIntegerField()
    judge = models.PositiveIntegerField()
    date = models.IntegerField()
    idg = models.PositiveIntegerField(blank=True, null=True)
    pos = models.IntegerField(blank=True, null=True)
    rnd = models.PositiveIntegerField(blank=True, null=True)
    idc1 = models.ForeignKey(LeagueClan, on_delete=models.CASCADE, related_name='teama')
    idc2 = models.ForeignKey(LeagueClan, on_delete=models.CASCADE, related_name='teamb')
    type = models.CharField(max_length=20, blank=True, null=True)
    idpt = models.PositiveSmallIntegerField()
    points1 = models.IntegerField()
    points2 = models.IntegerField()
    frags1 = models.SmallIntegerField()
    frags2 = models.SmallIntegerField()
    win1 = models.PositiveIntegerField()
    draw = models.PositiveIntegerField()
    win2 = models.PositiveIntegerField()
    maps = models.CharField(max_length=70)
    scores = models.CharField(max_length=70)
    descr = models.TextField()
    server = models.CharField(max_length=30)
    

    怎么了,谢谢?

    【讨论】:

      【解决方案2】:

      将 idc1 & idc2 从 integerfield 转换为 ForeignKey 字段,然后您可以通过 {{match.idc1.name}} 获取名称,如果速度变慢,您可以使用 select_related。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多