Django模板中的QuerySet、Tuple和Dictionary有什么区别?

5

我在理解如何在Django中遍历QuerySet、Tuple和Dictionary方面遇到了困难。

我对于像objects.all或objects.get这样的Django函数返回什么感到困惑。

假设我有:

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')

在每种情况下返回什么是最大的问题,如何迭代也让我感到困惑。所有这些都让我非常困惑。我学习了文档,但它们只是告诉我一件事,却不告诉我如何在模板中使用。我知道它与Python有关,但Python没有处理模板的功能。
2个回答

11

QuerySet: 一个Django类,用于处理SQL响应并返回代表结果的Python结构。它在许多方面的行为类似于列表,但实际上它是一个“可迭代对象”。它仅模拟列表的行为,以便您可以像使用for循环等东西一样使用它。

Tuple: 一个不可变的列表。这意味着一旦它被设置,就无法更改。在几乎所有其他方面,它的行为都像一个列表。

Dictionary: 也称为哈希,在其他语言中也是如此。它可以被认为是“有键列表”。在严格意义上,“列表”是在内存中串行存储的项目组。在编程的早期,你必须从列表中“弹出”项目并“推入”项目,并且它们只能以FIFO或先进先出的方式检索。字典提供了一种查找列表中项目的方法。它由键-值对组成,因此您可以引用一个键并获取附加的值。

现在谈到Django模板:

QuerySets: 您可以使用标准方法迭代这些对象。一旦您从像MyModel.objects.all()这样的地方获得结果,您可以使用{% for value in queryset %}标签。

Tuples: 就迭代而言,这些对象的行为与标准列表完全相同。您还可以简单地使用{% for value in tuple %}标签。唯一可能会遇到问题的是有时您会得到元组的元组或元组的列表。这些就像多级列表一样。您必须先迭代外部列表或元组,然后再迭代内部列表或元组。

Dictionaries: 这些是可能最复杂的,因为它们需要一个方法调用来获取可迭代对象。

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
你是指这些文档吗?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 %}

关于您的数据类型:
a 将是查询集或模型对象列表
b 将是一个模型对象
c 将是ValuesQuerySet或字典列表
d 也将是ValuesQuerySet,但实际上是元组列表
e 将是RawQuerySet,像普通的查询集一样
来源:
https://docs.djangoproject.com/en/dev/topics/db/sql/#django.db.models.Manager.raw
https://docs.djangoproject.com/en/dev/ref/models/querysets/#values
https://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list

谢谢伙计,现在一切都清楚了。之前对于元组有些困惑,但现在没问题了。 - tej.tan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接