我有以下Python代码:Django的查询集。去年()方法返回不正确元件
models.py
class Person(models.Model):
first_name = models.CharField(max_length=32, null=True, blank=True)
last_name = models.CharField(max_length=64, null=True, blank=True)
order = models.PositiveSmallIntegerField(null=True, blank=True)
我有两个人分别加入作为Persons
名为“人1”和“人2”,。他们都具有1
views.py
def get_people():
people = Person.objects.order_by('order')
print(people)
for p in people:
print(p)
if p == people.last():
print ('Last Person')
相同的顺序这里的结果:
>>> get_people()
[<Person: Person 1>, <Person: Person 2>]
<Person 1>
u'Last Person'
<Person 2>
花了一点挖,但我发现这个结果和根本原因。
>>> people = Person.objects.order_by('order')
>>> print(people)
[<Person: Person 1>, <Person: Person 2>]
>>> print(people.first())
<Person 1>
>>> print(people.last())
<Person 1>
>>> people.first() == people.last()
True
>>> people[0]
<Person 1>
>>> people[1]
<Person 2>
我看了看源代码,它出现在最后一个()方法只是运行reverse()
与我选择相同的排序。由于这两个元素具有相同的顺序号1,所以反方法返回与原始列表完全相同的列表,假设因为当对逆向排序时,同样的规则适用于在一个领带中具有最低记录ID的元素是第一个,而是真正扭转已经检索的列表。我不明白他们为什么不只是取得已经检索到的元素列表并从索引中获取最后一个元素。我尝试使用[-1]负指数来得到它,但是没有实现并引发异常。
那么有人可以解释为什么这样编码吗?如果您的某些元素与所订购的房产共享相同的价值,则可能会产生问题。特别是如果通过对last()的后续调用来多次访问queryset。这是为了表现还是我没有看到其他问题?相反,在这个用例使用最后的()方法,我只是在做这种比较,而不是:
if p == people[len(people) - 1]:
这工作。在这种情况下,我知道这些人并不是空的,所以我们不会得到IndexError - 如果它是空的,代码将永远不会在循环中执行。一般情况下可能是:
l = len(people)
return None if l == 0 else return people[l -1]
或者:
try:
l = len(people)
return people[l - 1]
except IndexError:
return None
你能分享这种行为的一些见解,请? Django文档中唯一说明last()方法与first()类似,但返回查询集的最后一个元素。在这种情况下,它不像描述的那样运行。这种行为让我感到困惑。我认为它只是从当前列表中取出最后一个元素,而不是创建一个新的反向列表并获取第一个元素。
在此先感谢...
你为什么不定义一个更好的排序?你有它的方式他们是一个领带,所以这里的第一个和最后一个想法是没有意义的.. – wim
这只是一个例子。人们在添加时应该被正确地命令,但不知怎的,他们不知所措。在可能具有相同记录的多个记录的字段上进行订购时,有许多实际示例。说出生日期。 – Furbeenator