Django:了解For循环中的对象的问题

时间:2019-11-18 18:01:18

标签: python django

我是Django的初学者。我正在构建一个名为PhoneReview的Django应用。它将存储与最新手机有关的评论。它还将显示手机品牌以及相关的手机型号。我设法对应用程序做了一些说明。现在,我对一行代码有些困惑。

我的一个模板文件中有这样的代码:

{% extends 'gamereview/base.html' %}

{% block title%}
Detail
{% endblock %}


{% block content %}

<h3>This is the review for {{game.title}} </h3>

<ul>{% for review_item in game.review_set.all %}
    <li>{{ review_item.review }}</li>
    {% endfor %}
</ul>

{% endblock %}

我不明白这部分内容:

<ul>{% for review_item in game.review_set.all %}

这行是什么意思?

以下是 models.py 中的代码:

from django.db import models
from django.template.defaultfilters import slugify

# Create your models here.
class Tag(models.Model):
    label = models.CharField(max_length=20)

    def __str__(self):
        return self.label

class Game(models.Model):
    title = models.CharField(max_length=100)
    developer = models.CharField(max_length=100)
    platform = models.CharField(max_length=50, default='null')
    label_tag = models.ManyToManyField(Tag)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)

class Review(models.Model):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    review = models.CharField(max_length=1000)
    date = models.DateField(auto_now=True)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.review

    def save(self):
        super(Review, self).save()
        self.slug = '%i-%s' % (
            self.id, slugify(self.game.title)
        )
        super(Review, self).save()

以下是 views.py 中的代码:

from django.views import generic
from .models import Game


class GameListView(generic.ListView):
    template_name = 'gamereview/gamelist.html'
    context_object_name = 'all_games'

    def get_queryset(self):
        return Game.objects.all()

class ReviewView(generic.DetailView):
    model = Game
    template_name = 'gamereview/review.html'

以下是 urls.py 中的代码:

from . import views
from django.urls import path

app_name = 'gamereview'

urlpatterns = [
    path('gamereview/', views.GameListView.as_view(), name='gamelist'),
    path('gamereview/<slug:slug>/', views.ReviewView.as_view(), name='review'),

]

我对这一行感到有些困惑:<ul>{% for review_item in game.review_set.all %}。您能帮我澄清一下吗?

1 个答案:

答案 0 :(得分:2)

看看models;有一个Game类。显然,您在模板中以game的名称收到了该类的实例。

Game类将Review类引用为外键。由于Django ORM的工作方式,这为Game类提供了反向链接.review_set;它包含所有引用特定游戏的评论对象。因此game.review_set

.review_set属性不是列表,而是数据库结果集。您可以对其进行过滤,排序等,但就您而言,您只是从中获取所有记录。因此game.review_set.all

请花一些时间阅读有关Django工作原理的介绍,其中有许多内容不能仅凭常识就可以得出。