В чем разница между QuerySet, Tuple, Dictionary в шаблоне Django - PullRequest
5 голосов
/ 07 июля 2011

У меня проблемы с пониманием того, как перебирать QuerySet, Tuple и Dictionarty в django.

Я запутался, какие функции djnago возвращают что-то вроде objects.all или objects.get

Предположим, у меня есть

a = model.objects.all()
b = model.object.get(pk=1)
c = Blog.objects.values('name', 'entry__headline')
d = Entry.objects.values_list('id', 'headline')
e = Person.objects.raw('SELECT * FROM myapp_person')

Что сохраняется в каждом сценарии, и самая большая проблема заключается в том, как я могу повторить. Все это очень смущает меня. Я изучаю документы, но они рассказывают одну вещь и не говорят, как использовать в шаблоне. Я знаю, что это связано с питоном, но тогда у питона нет шаблона для работы с

Ответы [ 2 ]

10 голосов
/ 07 июля 2011

QuerySet : класс Django, который обрабатывает ответы SQL и возвращает конструкцию python, представляющую результаты.Хотя он функционирует как список во многих отношениях, на самом деле он называется «повторяемым».Он просто имитирует поведение списка, чтобы позволить вам использовать такие вещи, как циклы for.

Tuple : неизменный список.Это означает, что как только он установлен, его нельзя изменить.Практически любым другим способом он ведет себя как список.

Словарь : также известен как хэш в других языках.Это можно считать «списком ключей».«Список» в самом строгом смысле - это группа элементов, хранящихся последовательно в памяти.В старые времена программирования вам приходилось «выталкивать» элементы и «выталкивать» элементы в список, и их можно было получить только в формате FIFO или по принципу «первым пришел - первым вышел».Словари предоставляют способ «поиска» элементов в списке.Он состоит из пар ключ-значение, поэтому вы можете ссылаться на ключ и получать прикрепленное значение.

Теперь в терминах шаблонов Django:

QuerySets : вы выполняете итерациюнад этим, используя стандартные методы.Как только вы получите результат из чего-то вроде MyModel.objects.all(), вы можете использовать тег {% for value in queryset %}.

Tuples : в отношении итерации они ведут себя точно как стандартные списки.Вы также можете просто использовать тег {% for value in tuple %}.Единственное потенциальное зависание в том, что иногда вы в конечном итоге получаете кортежи или список кортежей.Это как многоуровневые списки.Вы должны выполнить итерацию по внешнему списку или кортежу, а затем выполнить итерации по внутренним.

Словари : Это, вероятно, самые сложные, только потому, что они требуют вызова метода для получения итерируемогоobject.

mydict.iteritems() # returns an iterable consisting of `(key, value)` tuples.

mydict.iterkeys() # returns an iterable consisting of the keys. You can then use mydict[key] to get the values

mydict.itervalues() # returns an iterable consisting of the values.

Последний метод, вероятно, лучший из простых итераций в шаблоне Django:

{% for value in mydict.itervalues %}
4 голосов
/ 07 июля 2011

Вы имеете в виду эти документы?https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

Я думаю, это то, что вы искали.

В основном вы итерируете их как:

{% for item in a %}
{{item.field}}
{{item.field2}}
{% endfor %}

{{b.field}}

{% for item in c %}
{{item.name}}
{{item.entry__headline}}
{% endfor %}

{% for item in d %}
{{item}}
{% endfor %}

# Also you can do this if you want to access just a particular index:
{{d.0}}
{{d.1}}

{% for item in e %}
{{item.field}}
{{item.field2}}
{% endfor %}

Что касается ваших типов данных:будет QuerySet или список объектов моделиб будет модельным объектомc будет ValuesQuerySet или список словарейd также будет ValuesQuerySet, но на самом деле это список кортежейЭто будет RawQuerySet, который действует как обычный QuerySet

Источники:https://docs.djangoproject.com/en/dev/topics/db/sql/#django.db.models.Manager.raw
https://docs.djangoproject.com/en/dev/ref/models/querysets/#valueshttps://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list

...