我有一个带有一个字段的模型,它引用了另一个模型 - 如下所示:
from random import randint
from django.db import models
from django.db.models import Count
class UsersManager(models.Manager):
def random(self):
count = self.aggregate(count=Count('id'))['count']
random_index = randint(0, count - 1)
return self.all()[random_index]
class Game(models.Model):
web_name = models.SlugField(max_length=40, unique=True)
name = models.CharField(max_length=40)
description = models.TextField()
category = models.CharField(max_length=2)
multiplayer = models.BooleanField()
objects = UsersManager()
def __unicode__(self):
return self.name
class Featured(models.Model):
featured_game = models.ForeignKey(Game, unique=True)
objects = UsersManager()
def __unicode__(self):
return self.featured_game.name
在我的一个视图中,我生成要在模板页面中使用的查询集,例如
game_list = Game.objects.filter(multiplayer=True)
或
game_list = Game.objects.all()
或
game_list = Featured.objects.all()
使用最后一个查询集,我的印象是我能够访问Game属性,并在模板中创建for循环,就像我在第2步中所做的那样。但是它返回了TemplateSyntaxError。
我为精选而制作新模型的主要原因是,我需要从主列表和精选列表 - 使用上面显示的用户管理器。
显然我正在做一些根本错误的事情,那么生成特色模型中Game对象的查询集的最佳方法是什么?
编辑:
我也在使用分页,也许是导致问题的原因,这是我视图结尾处的代码:
paginator = Paginator(game_list, 20) # Show 20 games per page
# Make sure page request is an int. If not, deliver first page.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
# If page request (9999) is out of range, deliver last page of results.
try:
games = paginator.page(page)
except (EmptyPage, InvalidPage):
games = paginator.page(paginator.num_pages)
c = {
'games': games,
}
return render_to_response('category.html', c)
以下是模板中的代码(请注意,视图是我实际代码中Game的一个属性):
{% for game in games.object_list %}
<h2>{{ game.name }}</h2>
<h2>{{ game.description }}</h2>
<h2>{{ game.views }}</h2>
{% endfor %}
这是特定的错误消息:
Template error
In template /home/jon/templates/category.html, error at line 5
Caught FieldError while rendering: Cannot resolve keyword 'views' into field. Choices are: featured_game, id
1 Game category here
2
3 <h1>{{ category }}</h1>
4
5 {% for game in games.object_list %}
6 <h2>{{ game.name }}</h2>
7
8 <h2>{{ game.description }}</h2>
9
10 <h2>{{ game.views }}</h2>
11
12 {% endfor %}
答案 0 :(得分:0)
顺便问一下,你在说什么语法错误?
发布代码很有用。
是的,所有精选游戏都可以通过Featured.objects.all()
{% for featured in featured_games %}
{{ featured.featured_game }}
{% endfor %}
注意:我建议您使用select_related()
来确保您只进行一次查询。
http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.QuerySet.select_related
要在最后回答您的问题,您可以执行:Game.objects.filter(featured__isnull=False)
,但我认为修复模板语法错误将是更好的解决方案并使用Featured.objects.select_related()