【问题标题】:Can I write the following Django code more effectively? [closed]我可以更有效地编写以下 Django 代码吗? [关闭]
【发布时间】:2015-06-06 11:39:13
【问题描述】:

我有几个模型 - UserScore。我正在将这些模型中的数据显示到我的模板中。来自Score 的数据根据​​来自User 的数据进行过滤。我在模板中使用嵌套的 for 循环和 if 条件来获得我想要的结果。但是,我想知道是否有更好的方法来得出相同的结果,因为一旦数据数量庞大,嵌套的 for 循环将消耗大量时间和资源。

models.py

class User(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()

class Score(models.Model):
    user = models.ForeignKey('User')
    subject = models.CharField(max_length=20)
    score = models.IntegerField()

views.py

def Home(request):
    users = User.objects.all()
    scores = Score.objects.all()
    return render(request, "home.html", {'users': users, 'scores': scores})

home.html(模板)

{% for user in users %}
    {% for score in scores %}
    {% if score.user == user %} {{ user }} -- {{ score.subject }} -- {{ score.score }} <br>{% endif %}
    {% endfor %}
    {% endfor %}

结果

Michel -- Physics -- 80 
Michel -- Chemistry -- 90 
Zarif -- Physics -- 100 
Zarif -- Biology -- 80 

这个问题是this 的简化版。如果可以的话,也可以在那边回答!

【问题讨论】:

  • 我投票结束这个问题,因为它属于Code Review
  • 我在 Code Review 中发布了同样的问题,但它仍然有 1 个视图。

标签: django loops templates object nested


【解决方案1】:

以下方式不需要查询所有分数,也不需要比较对象。但我确信你要解决的问题是不同的:)。

{% for user in users %}
    {% for score in user.score_set.all %}
    {{ user }} -- {{ score.subject }} -- {{ score.score }} <br>
    {% endfor %}
{% endfor %}

【讨论】:

  • 如果我遵循您的代码,那么即使用户与该主题没有外键关系,也会显示用户 -- 主题 -- 分数。我使用 if 语句检查 score.user 是否等于当前内存中的用户对象。否则,将为每个用户打印所有主题,这不是我想要的。有一种叫做 zip() 的方法,我在某处读过它,但不明白它的作用。这和我的问题有关吗?
  • 只有用户主题和分数被拉到那里。此处仅使用具有 fk 关系的那些。
  • 抱歉,这段代码在我的 html 中没有显示任何内容。刚刚试了一下。 :( 应该是 user.scores_set.all 吗?
  • 是的。也编辑了回复。谢谢
  • score_set 准确地说。不是scores。谢谢你。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2021-05-07
  • 2021-12-21
  • 1970-01-01
  • 2011-10-16
  • 2022-06-15
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多