在django中,values(* field)不会给出带有切片查询集的ForeignKey字段的所有值

时间:2016-12-27 09:16:21

标签: python django django-queryset

self.model.objects.filter(pk=2)[:1].values('name', 'entry__headline')
self.model.objects.filter(pk=2).values('name', 'entry__headline')

为什么第一个不能返回外键字段的所有值,但第二个字段是否可以作为期望值?

首先返回:

QuerySet [{'name': 'My blog', 'entry__headline': 'An entry'}]

第二次回归:

QuerySet [{'name': 'My blog', 'entry__headline': 'An entry'},
     {'name': 'My blog', 'entry__headline': 'Another entry'}, ...]

所以就像第一个不能返回外键字段的所有结果一样。

2 个答案:

答案 0 :(得分:1)

边缘,

pk(主键)始终是唯一的。这是主键的目的之一。这反过来将有助于索引。所以,我不确定为什么第二个返回查询集中的多个对象。

PS:如果我错了,请纠正我。

答案 1 :(得分:0)

列表切片如何工作,[:1]表示[0:1](从索引0到索引1)并不包括1

>>> my_list = [1, 2, 3]
>>> my_list
[1, 2, 3]
>>> my_list[:1]
[1]
>>> my_list[0:1]
[1]

SomeModel.objects.filter(pk__gte=2)[:1]表示您正在切片QuerySet,结果是模型实例列表。

SomeModel.objects.filter(pk__gte=2).values('name')[:1]表示您正在切片ValuesQuerySet,结果是词典列表。

请看以下示例:

>>> from polls.models import Question
>>> 
>>> Question.objects.all()
[<Question: q1>, <Question: q2>, <Question: q3>]
>>> Question.objects.filter(pk__gte=2)  # returns QuerySet
[<Question: q2>, <Question: q3>]
>>> Question.objects.filter(pk__gte=2)[:1]  # slicing a QuerySet
[<Question: q2>]  # list of Question instances
>>> 
>>> Question.objects.filter(pk__gte=2).values('question_text')  # returns ValuesQuerySet
[{'question_text': u'q2'}, {'question_text': u'q3'}]
>>> Question.objects.filter(pk__gte=2).values('question_text')[:1]  # slicing a ValuesQuerySet
[{'question_text': u'q2'}]  # list of dictionaries

注意: SomeModel.objects.filter(pk=2)将始终返回包含1个对象的QuerySet(在这种情况下,pk = 2)。