从2级深度获取最新的5个对象

时间:2011-09-28 22:24:14

标签: django django-templates

我有3个模特

class Category(models.Model):
    name = models.CharField(unique=True, max_length=150)
    ...

class Group(models.Model):
    name = models.CharField(unique=True, max_length=150)
    category = models.ForeignKey(Category)
    ...

class Item(models.Model):
    name = models.CharField(max_length=150)
    group = models.ForeignKey(Group)
    date = models.DateTimeField(editable=False)
    ...

    class Meta:
    ordering = ['-date']

现在我需要获取属于模板类别的最新5项,因此对于已知类别中的组,它很容易

{% for x in category.group_set.all %}
    {{ x.name }} # get the group
    {% for y in x.item_set.all|slice:":5" %}
      {{ y.name }} # get the items from the group
    {% endfor %}
{% endfor %}

问题是当我有类别列表而不需要组时,只加入属于该类别的最新5个项目。如果我使用

 {% for category in categories %}
     {% for x in category %} # gives me group again

我希望我能解释这个问题。我整天都在寻找解决方案。 感谢

1 个答案:

答案 0 :(得分:2)

我认为这不是一个可以通过模板代码轻松解决的问题,因为它需要比默认情况下更复杂的查询集。我可能会通过向Category类添加一个方法来解决这个问题:

class Category(models.Model):
    name = models.CharField(unique=True, max_length=150)
    ...

    def latest_items(self):
        return Item.objects.filter(group__category=self)

然后在模板代码中:

{% for category in categories %}
    {% for item in category.latest_items %} 
        {{ y.name }}
    {% endfor %}
{% endfor %}

请注意,在这种情况下,您可能需要在Category课程后定义Item课程,并create the ForeignKey relationships to Category with strings