Django:基于另一个模型中的对象,从模型生成对象的查询集

时间:2011-02-19 20:59:22

标签: django django-models

我有一个带有一个字段的模型,它引用了另一个模型 - 如下所示:

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 %}

1 个答案:

答案 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()