Джанго запрос: еще один вопрос - PullRequest
0 голосов
/ 05 апреля 2011

Здравствуйте. Кажется, у меня возникли проблемы с подсчетом в Django. У меня есть список предметов, которые только отображают его последний статус. Все эти предметы, имеющие статус «Уничтожено», были удалены. Это печатает красиво.

  status_items = models.StorageItem.objects.filter(client=client_id, itemstatushistory__isnull=False).distinct()

{% for item in status_items %}
        {{item.itemstatushistory_set.latest|cut:"Destroyed"}}
{% endfor %}

Но по какой-то причине я не могу сосчитать.

  status_items = models.StorageItem.objects.filter(client=client_id, itemstatushistory__isnull=False).distinct().count()

TypeError while rendering: 'int' object is not iterable

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

после

status_items = models.StorageItem.objects
                     .filter(client=client_id, itemstatushistory__isnull=False)
                     .distinct().count()

status_items будет содержать количество элементов -> int объект

, использующий его в шаблоне в {% for item in status_items %}, очевидно, выдаст ошибку.

вы можете оставить его без count() и в шаблоне получить доступ к счетчику следующим образом:

{{ status_items.count }}

Система шаблонов вызовет для вас status_items.count().Больше информации здесь: рендеринг-контекст

РЕДАКТИРОВАНИЕ:

@ Shehzad009 : Чего я пытаюсь достичь, состоит в том, чтобы сосчитать все предметы, которые имеют свой последний статус не уничтожен.Из-за отношения «один ко многим» и потому, что я хочу посчитать последние статусы только для каждого элемента, это немного сложно

, вы можете определить status_items следующим образом:

#storageItems where itemstatushistory__status != 'Destroyed'
storage_items = models.StorageItem.objects
                .filter(client=client_id,
                        itemstatushistory__isnull=False
                        )
                .distinct()

# list of items with latest status != 'Destroyed'
status_items = [item for item in storage_items 
                if item.itemstatushistory_set.latest().description !='Destroyed']

# list of items with latest status not in ['Destroyed', 'Out']
status_items = [item for item in storage_items
                if item.itemstatushistory_set.latest().description
                   not in ['Destroyed', 'Out']]

затем в шаблоне:

{# show items with latest status != destroyed  #}
{% for item in status_items %}
        {{ item }}
{% endfor %}

{# items with latest status != destroyed count #}
{{ status_items|length }}
0 голосов
/ 05 апреля 2011

На какой версии Django вы работаете?

Может быть, вы могли бы рассмотреть возможность использования синтаксиса аннотации, как описано здесь в разделе Агрегации и других предложениях QuerySet:

http://docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregations-and-other-queryset-clauses

0 голосов
/ 05 апреля 2011
status_items = models.StorageItem.objects.filter(client=client_id, itemstatushistory__isnull=False).distinct().count()
{% for item in status_items %}
        {{item.itemstatushistory_set.latest|cut:"Destroyed"}}
{% endfor %}

Вы установили status_items в целое число, поэтому вы не можете затем сделать for item in status_items.

Чего вы пытаетесь достичь?

...