mysql - Django - 对于在字典中传递的两个变量的循环

标签 mysql django dictionary for-loop

在我的 view.py 文件中,我有两个查询,每个查询都分配了一个变量名。查询 1 收集评论表中的所有评论。查询 2 计算评论表中每个评论的平均评分。两个查询,一张表。

我已将查询 1(名为 reviews)和 查询 2(名为 ratings)放在一个名为 context 的字典将被传递到我的 html 文件。

我的目标是显示每条评论和该评论的评分。但是,我无法使用当前方法正确显示它。这是我的 html 文件:

{% extends "reviews/layout.html" %}
{% block content %}
    {% for review in reviews %}
      {% for rating in ratings %}
        <article class="media content-section">
          <img class="rounded-circle article-img" src="{{ review.author.profile.image.url }}">
          <div class="media-body">
            <div class="article-metadata">
              <h4 class="mr-2">{{ review.company }} {{ rating.rate }}</h4>
              <small class="text-muted">{{ review.date_posted|date:"F d, Y" }}</small>
            </div>
            <h5><a class="article-title" href="{% url 'review-detail' review.id %}">{{ review.title }}</a></h5>
            <p class="article-content">{{ review.content }}</p>
          </div>
        </article>
      {% endfor %}
    {% endfor %}
{% endblock content %}

我在 for 循环中有一个 for 循环。正如预期的那样,每个评论的结果都会针对每个平均值一遍又一遍地显示。例如,我有 7 条评论,评分为 7。结果看起来像这样:(注意:我将结果放在代码标签中以便更容易看到。)

Review 1, rating for review 1
Review 1, rating for review 2
Review 1, rating for review 3
Review 1, rating for review 4
Review 1, rating for review 5
Review 1, rating for review 6
Review 1, rating for review 7

Review 2, rating for review 1
Review 2, rating for review 2
....
Review 2, rating for review 7

相反,我的目标是看到:

Review 1, rating for review 1
Review 2, rating for review 2
Review 3, rating for review 3
Review 4, rating for review 4
...

我的 view.py 文件:


def reviews(request):
    reviews = Review.objects.all()

    ratings = Review.objects.filter(id__in=[review.id for review in reviews]).annotate(rate=(F('value1')+F('value2')+F('value3')+F('value4'))/4)

    context = {
        'reviews': reviews,
        'ratings': ratings
    }
    return render(request, 'reviews/reviews.html', context)

我读过其他使用 zip() 的情况,但我认为不适用于我的情况?

我知道这是一个菜鸟挑战,但我是 Django 的新手,我正在学习。欢迎所有建议。

最佳答案

这可能只是个人偏好,但我喜欢结合相关的上下文字段。 如果我对您的代码的理解正确,您希望对所有评分进行审核,这可以通过编辑 View 来实现。

def someview(request):
  reviews = Review.objects.all()
  review_list = []
  for review in reviews:
     ratings = Rating.objects.filter(review=review)
     ratings_list = []
     for rating in ratings:
        ratings_list.append({
             'rating_value':rating.value
        })
     review_list.append({
          'id':review.pk
          'ratings':ratings_list,
     })
  context = {'reviews':review_list}

然后在您的 html 中您可以执行以下操作:

{% for review in reviews %}
      {% for rating in review.ratings %}
      Review {{review.id}}, rating is {{rating.value}}
      {% endfor %}
{% endfor %}

关于mysql - Django - 对于在字典中传递的两个变量的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54606216/

相关文章:

php - 数据不显示

mysql - 如何在没有 CFadmin 访问权限的情况下远程调试 Coldfusion AJAX 应用程序?

mysql - SQL计算排名

python - 在 django 中对 FileField 进行单元测试的干净方法是什么?

python - 使用默认值从字典列表中提取项目

sql - MySQL:选择不同的字段,但也获取其余的列?

javascript - Ajax Form 和 Django 集成发布错误

python - Python/Django 中未捕获 urllib HTTPError

dictionary - 无法在 Jenkins Pipeline 中使用 Groovy 迭代 Map

python - 来自 df 的字典,键内有列