【问题标题】:Whats the difference between QuerySet , Tuple , Dictionary in Django templateDjango 模板中的 QuerySet 、 Tuple 、 Dictionary 有什么区别
【发布时间】:2011-09-30 12:25:36
【问题描述】:

我无法理解如何在 django 中迭代 QuerySet 、 Tuple 和 Dictionarty 。

我很困惑哪些 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')

每个场景中返回的内容是什么,最大的问题是我如何迭代。 所有这些都让我很困惑。我研究了文档,但它们只讲了一件事,并没有讲到如何在模板中使用。我知道它与python有关,但python没有模板来处理

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    QuerySet:处理 SQL 响应并返回表示结果的 python 构造的 Django 类。尽管它在很多方面都像一个列表,但它实际上就是所谓的“可迭代”。它只是模拟列表的行为,以允许您在其上使用诸如 for 循环之类的东西。

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

    字典:在其他语言中也称为哈希。它可以被认为是一个“键控列表”。最严格意义上的“列表”是一组连续存储在内存中的项目。在过去的编程时代,您必须“弹出”项目并将项目“推送”到列表中,并且只能以 FIFO 或先进先出的方式检索它们。字典提供了一种在列表中“查找”项目的方法。它由键值对组成,因此您可以引用一个键并获取附加值。

    现在就 Django 模板而言:

    QuerySets:您使用标准方法迭代这些。从MyModel.objects.all() 之类的内容中获得结果后,您可以使用{% for value in queryset %} 标记。

    元组:就迭代而言,它们的行为与标准列表完全相同。您也可以只使用{% for value in tuple %} 标签。唯一潜在的问题是有时你会得到一个元组的元组或一个元组的列表。这些就像多级列表一样。您必须遍历外部列表或元组,然后遍历内部列表。

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

    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 %}
    

    【讨论】:

      【解决方案2】:

      您指的是这些文档吗? 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 将是 QuerySet 或模型对象列表
      b 将是一个模型对象
      c 将是 ValuesQuerySet 或字典列表
      d 也是一个 ValuesQuerySet 但它实际上是一个元组列表
      e 将是一个 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/#values
      https://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list

      【讨论】:

      • 谢谢哥们,现在一切都搞定了,和 tuplt 混淆了,但现在没问题
      猜你喜欢
      • 2011-04-08
      • 2018-06-11
      • 1970-01-01
      • 2011-12-16
      • 2014-10-22
      • 2012-04-27
      • 2022-01-03
      • 2014-10-27
      相关资源
      最近更新 更多