Получите последние 5 объектов с глубины 2 уровня - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть 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 Ответ

2 голосов
/ 29 сентября 2011

Я не думаю, что это проблема, которую можно легко решить с помощью кода шаблона, поскольку он требует более сложного набора запросов, чем те, которые доступны по умолчанию.Возможно, я бы решил эту проблему, добавив метод в класс 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 в этом случае и создают отношения ForeignKey для Category со строками .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...