ModelBase,实例,迭代和order_by

时间:2014-09-08 10:51:04

标签: python django

这里有几个不同的问题,但它们是混合的。

我知道类和实例之间存在差异,但我似乎无法弄清楚如何访问后者而不是前者。在民意调查教程1中,他们做q =问题(question_text =“怎么了?”),然后做各种各样的事情。但这很容易。此时,只有一个Question对象。当然我不应该为我表中的每一行创建变量,是吗?必须有更好的方法,但我找不到它。例如:

for a in Articles:
    print a.sections_set.order_by('id')
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'ModelBase' object is not iterable

for a in Articles():
    print a.sections_set.order_by('id')
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'Articles' object is not iterable

我遇到了很多像这样的类型错误,并非所有错误都具有'可迭代'。我看到Loop Like A Native视频,所以我尝试了:

def __iter__(self):
    for a in Articles:
        print a.sections_set.order_by('id')
__iter__(Articles)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<console>", line 2, in __iter__
TypeError: 'ModelBase' object is not iterable

我在这里的最终用例只是让各个部分按顺序显示。目前他们出现在他们各自的文章下,这是正确的*,但是以相反的顺序,我似乎也无法修复。我把

Sections.objects.order_by('id')

在我看来

我把

class meta:
    ordering = ['id']

在我的Sections模型上。什么都行不通。

(*)我也把

Articles.objects.order_by('id')

在同一视图中,这几乎起作用。除了第一条和第二条之间的第六条之外,它确实使条款有序。我经历了所有这些,一次一个,发现

Articles.objects.get(name='Article I')
<Articles: Article I>

A1 = Articles.objects.get(name='Article I')
A1.id
3

Articles.objects.get(name='Article II')
<Articles: Article II>

A2=Articles.objects.get(name='Article II')
A2.id
13

(我也不知道第二条如何一直跳到id = 13,因为我把它们放在同一时间并按顺序排列。)

A6=Articles.objects.get(name='Article VI')
A6.id
17

上次我检查过,13次是17次之前.Python / Django是否有罗马数字的问题?如果是这样,那么为什么其他所有人现在都按照正确的顺序呢?

这就是杀手:我的模板完全没有基于相同视图代码的迭代问题:

{% for a in A %}
<h1><li><a href="{% url 'TOC' %}">{{ a.name }} {{ a.popular_name }}</a></li></h1>
    {% for section in a.sections_set.all %}
        <h2><li><a href="{% url 'TOC' %}">{{ section.name }} {{ section.popular_name }}</a></li></h2>
    {% endfor %}
{% endfor %}

除了上面描述的问题之外,这段代码没有任何问题。但是这段代码

{% for a in A %}
    <h1><li><a href="{% url 'TOC' %}">{{ a.name }} {{ a.popular_name }}</a></li></h1>
        {% for section in a.sections_set.order_by('id') %}
            <h2><li><a href="{% url 'TOC' %}">{{ section.name }} {{ section.popular_name }}</a></li></h2>
    {% endfor %}
{% endfor %}

抛出模板语法错误:

Could not parse the remainder: '('id')' from 'a.sections_set.order_by('id')'

最后,在民意调查教程3中,当他们介绍渲染时,他们用order_by更改代码而没有解释,来自

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]

def index(request):
    latest_question_list = Question.objects.all().order_by('-pub_date')[:5]

如果a)保持一致并且b)解释这样的变化,这将有助于我理解如何使用它。

1 个答案:

答案 0 :(得分:0)

您问题的第二部分似乎完全回答了第一部分:要遍历所有文章,您使用objects经理,即Article.objects.all()将所有文章全部归还,Article.objects.order_by('whatever')修改排序,或Article.objects.filter(fieldname=whatever)查询某个字段值。

对于第二部分,当然,Django对罗马数字一无所知:事实上,其中一些是有序的,这是巧合。并且您不应该依赖主键 - id - 进行排序:如果删除并重新创建项目,您将获得更高的ID,因为数据库通常不会重复使用ID。您应该在模型上添加特定的order字段,然后按该字段排序。

最后,模板语言根本不允许带参数的函数调用,这就是你得到错误的原因。