fix BaseQuerySet.fields when mixing exclusion/inclusion with complex values like $slice
This commit is contained in:
parent
f4e1d80a87
commit
a52d3b92a8
@ -933,7 +933,20 @@ class BaseQuerySet(object):
|
|||||||
key = '.'.join(parts)
|
key = '.'.join(parts)
|
||||||
cleaned_fields.append((key, value))
|
cleaned_fields.append((key, value))
|
||||||
|
|
||||||
fields = sorted(cleaned_fields, key=operator.itemgetter(1))
|
# Sort fields by their values, explicitly excluded fields first, then
|
||||||
|
# explicitly included, and then more complicated operators such as
|
||||||
|
# $slice.
|
||||||
|
def _sort_key(field_tuple):
|
||||||
|
key, value = field_tuple
|
||||||
|
if isinstance(value, (int)):
|
||||||
|
return value # 0 for exclusion, 1 for inclusion
|
||||||
|
else:
|
||||||
|
return 2 # so that complex values appear last
|
||||||
|
|
||||||
|
fields = sorted(cleaned_fields, key=_sort_key)
|
||||||
|
|
||||||
|
# Clone the queryset, group all fields by their value, convert
|
||||||
|
# each of them to db_fields, and set the queryset's _loaded_fields
|
||||||
queryset = self.clone()
|
queryset = self.clone()
|
||||||
for value, group in itertools.groupby(fields, lambda x: x[1]):
|
for value, group in itertools.groupby(fields, lambda x: x[1]):
|
||||||
fields = [field for field, value in group]
|
fields = [field for field, value in group]
|
||||||
|
@ -141,6 +141,16 @@ class OnlyExcludeAllTest(unittest.TestCase):
|
|||||||
self.assertEqual(qs._loaded_fields.as_dict(),
|
self.assertEqual(qs._loaded_fields.as_dict(),
|
||||||
{'b': {'$slice': 5}})
|
{'b': {'$slice': 5}})
|
||||||
|
|
||||||
|
def test_mix_slice_with_other_fields(self):
|
||||||
|
class MyDoc(Document):
|
||||||
|
a = ListField()
|
||||||
|
b = ListField()
|
||||||
|
c = ListField()
|
||||||
|
|
||||||
|
qs = MyDoc.objects.fields(a=1, b=0, slice__c=2)
|
||||||
|
self.assertEqual(qs._loaded_fields.as_dict(),
|
||||||
|
{'c': {'$slice': 2}, 'a': 1})
|
||||||
|
|
||||||
def test_only(self):
|
def test_only(self):
|
||||||
"""Ensure that QuerySet.only only returns the requested fields.
|
"""Ensure that QuerySet.only only returns the requested fields.
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user