这里有几个不同的问题,但它们是混合的。
我知道类和实例之间存在差异,但我似乎无法弄清楚如何访问后者而不是前者。在民意调查教程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)解释这样的变化,这将有助于我理解如何使用它。
答案 0 :(得分:0)
您问题的第二部分似乎完全回答了第一部分:要遍历所有文章,您使用objects
经理,即Article.objects.all()
将所有文章全部归还,Article.objects.order_by('whatever')
修改排序,或Article.objects.filter(fieldname=whatever)
查询某个字段值。
对于第二部分,当然,Django对罗马数字一无所知:事实上,其中一些是有序的,这是巧合。并且您不应该依赖主键 - id
- 进行排序:如果删除并重新创建项目,您将获得更高的ID,因为数据库通常不会重复使用ID。您应该在模型上添加特定的order
字段,然后按该字段排序。
最后,模板语言根本不允许带参数的函数调用,这就是你得到错误的原因。