Ensure as_pymongo() and to_json honour only() and exclude() (#293)
This commit is contained in:
parent
b0c1ec04b5
commit
5d7444c115
@ -4,6 +4,7 @@ Changelog
|
|||||||
|
|
||||||
Changes in 0.8.X
|
Changes in 0.8.X
|
||||||
================
|
================
|
||||||
|
- Ensure as_pymongo() and to_json honour only() and exclude() (#293)
|
||||||
- Document serialization uses field order to ensure a strict order is set (#296)
|
- Document serialization uses field order to ensure a strict order is set (#296)
|
||||||
- DecimalField now stores as float not string (#289)
|
- DecimalField now stores as float not string (#289)
|
||||||
- UUIDField now stores as a binary by default (#292)
|
- UUIDField now stores as a binary by default (#292)
|
||||||
|
@ -822,8 +822,7 @@ class QuerySet(object):
|
|||||||
|
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
"""Converts a queryset to JSON"""
|
"""Converts a queryset to JSON"""
|
||||||
queryset = self.clone()
|
return json_util.dumps(self.as_pymongo())
|
||||||
return json_util.dumps(queryset._collection_obj.find(queryset._query))
|
|
||||||
|
|
||||||
def from_json(self, json_data):
|
def from_json(self, json_data):
|
||||||
"""Converts json data to unsaved objects"""
|
"""Converts json data to unsaved objects"""
|
||||||
@ -1095,7 +1094,7 @@ class QuerySet(object):
|
|||||||
raise StopIteration
|
raise StopIteration
|
||||||
if self._scalar:
|
if self._scalar:
|
||||||
return self._get_scalar(self._document._from_son(
|
return self._get_scalar(self._document._from_son(
|
||||||
self._cursor.next()))
|
self._cursor.next()))
|
||||||
if self._as_pymongo:
|
if self._as_pymongo:
|
||||||
return self._get_as_pymongo(self._cursor.next())
|
return self._get_as_pymongo(self._cursor.next())
|
||||||
|
|
||||||
@ -1370,7 +1369,15 @@ class QuerySet(object):
|
|||||||
new_data = {}
|
new_data = {}
|
||||||
for key, value in data.iteritems():
|
for key, value in data.iteritems():
|
||||||
new_path = '%s.%s' % (path, key) if path else key
|
new_path = '%s.%s' % (path, key) if path else key
|
||||||
if all_fields or new_path in self.__as_pymongo_fields:
|
|
||||||
|
if all_fields:
|
||||||
|
include_field = True
|
||||||
|
elif self._loaded_fields.value == QueryFieldList.ONLY:
|
||||||
|
include_field = new_path in self.__as_pymongo_fields
|
||||||
|
else:
|
||||||
|
include_field = new_path not in self.__as_pymongo_fields
|
||||||
|
|
||||||
|
if include_field:
|
||||||
new_data[key] = clean(value, path=new_path)
|
new_data[key] = clean(value, path=new_path)
|
||||||
data = new_data
|
data = new_data
|
||||||
elif isinstance(data, list):
|
elif isinstance(data, list):
|
||||||
|
@ -3276,6 +3276,28 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertEqual(results[1]['name'], 'Barack Obama')
|
self.assertEqual(results[1]['name'], 'Barack Obama')
|
||||||
self.assertEqual(results[1]['price'], Decimal('2.22'))
|
self.assertEqual(results[1]['price'], Decimal('2.22'))
|
||||||
|
|
||||||
|
def test_as_pymongo_json_limit_fields(self):
|
||||||
|
|
||||||
|
class User(Document):
|
||||||
|
email = EmailField(unique=True, required=True)
|
||||||
|
password_hash = StringField(db_field='password_hash', required=True)
|
||||||
|
password_salt = StringField(db_field='password_salt', required=True)
|
||||||
|
|
||||||
|
User.drop_collection()
|
||||||
|
User(email="ross@example.com", password_salt="SomeSalt", password_hash="SomeHash").save()
|
||||||
|
|
||||||
|
serialized_user = User.objects.exclude('password_salt', 'password_hash').as_pymongo()[0]
|
||||||
|
self.assertEqual(set(['_id', 'email']), set(serialized_user.keys()))
|
||||||
|
|
||||||
|
serialized_user = User.objects.exclude('id', 'password_salt', 'password_hash').to_json()
|
||||||
|
self.assertEqual('[{"email": "ross@example.com"}]', serialized_user)
|
||||||
|
|
||||||
|
serialized_user = User.objects.exclude('password_salt').only('email').as_pymongo()[0]
|
||||||
|
self.assertEqual(set(['email']), set(serialized_user.keys()))
|
||||||
|
|
||||||
|
serialized_user = User.objects.exclude('password_salt').only('email').to_json()
|
||||||
|
self.assertEqual('[{"email": "ross@example.com"}]', serialized_user)
|
||||||
|
|
||||||
def test_no_dereference(self):
|
def test_no_dereference(self):
|
||||||
|
|
||||||
class Organization(Document):
|
class Organization(Document):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user