Merge branch 'master' into 0.8M
Conflicts: AUTHORS docs/django.rst mongoengine/base.py mongoengine/queryset.py tests/fields/fields.py tests/queryset/queryset.py tests/test_dereference.py tests/test_document.py
This commit is contained in:
@@ -827,20 +827,20 @@ class InstanceTest(unittest.TestCase):
|
||||
float_field = FloatField(default=1.1)
|
||||
boolean_field = BooleanField(default=True)
|
||||
datetime_field = DateTimeField(default=datetime.now)
|
||||
embedded_document_field = EmbeddedDocumentField(EmbeddedDoc,
|
||||
default=lambda: EmbeddedDoc())
|
||||
embedded_document_field = EmbeddedDocumentField(
|
||||
EmbeddedDoc, default=lambda: EmbeddedDoc())
|
||||
list_field = ListField(default=lambda: [1, 2, 3])
|
||||
dict_field = DictField(default=lambda: {"hello": "world"})
|
||||
objectid_field = ObjectIdField(default=bson.ObjectId)
|
||||
reference_field = ReferenceField(Simple, default=lambda:
|
||||
Simple().save())
|
||||
Simple().save())
|
||||
map_field = MapField(IntField(), default=lambda: {"simple": 1})
|
||||
decimal_field = DecimalField(default=1.0)
|
||||
complex_datetime_field = ComplexDateTimeField(default=datetime.now)
|
||||
url_field = URLField(default="http://mongoengine.org")
|
||||
dynamic_field = DynamicField(default=1)
|
||||
generic_reference_field = GenericReferenceField(
|
||||
default=lambda: Simple().save())
|
||||
default=lambda: Simple().save())
|
||||
sorted_list_field = SortedListField(IntField(),
|
||||
default=lambda: [1, 2, 3])
|
||||
email_field = EmailField(default="ross@example.com")
|
||||
@@ -848,7 +848,7 @@ class InstanceTest(unittest.TestCase):
|
||||
sequence_field = SequenceField()
|
||||
uuid_field = UUIDField(default=uuid.uuid4)
|
||||
generic_embedded_document_field = GenericEmbeddedDocumentField(
|
||||
default=lambda: EmbeddedDoc())
|
||||
default=lambda: EmbeddedDoc())
|
||||
|
||||
Simple.drop_collection()
|
||||
Doc.drop_collection()
|
||||
@@ -1127,20 +1127,20 @@ class InstanceTest(unittest.TestCase):
|
||||
u3 = User(username="hmarr")
|
||||
u3.save()
|
||||
|
||||
p1 = Page(comments = [Comment(user=u1, comment="Its very good"),
|
||||
Comment(user=u2, comment="Hello world"),
|
||||
Comment(user=u3, comment="Ping Pong"),
|
||||
Comment(user=u1, comment="I like a beer")])
|
||||
p1 = Page(comments=[Comment(user=u1, comment="Its very good"),
|
||||
Comment(user=u2, comment="Hello world"),
|
||||
Comment(user=u3, comment="Ping Pong"),
|
||||
Comment(user=u1, comment="I like a beer")])
|
||||
p1.save()
|
||||
|
||||
p2 = Page(comments = [Comment(user=u1, comment="Its very good"),
|
||||
Comment(user=u2, comment="Hello world")])
|
||||
p2 = Page(comments=[Comment(user=u1, comment="Its very good"),
|
||||
Comment(user=u2, comment="Hello world")])
|
||||
p2.save()
|
||||
|
||||
p3 = Page(comments = [Comment(user=u3, comment="Its very good")])
|
||||
p3 = Page(comments=[Comment(user=u3, comment="Its very good")])
|
||||
p3.save()
|
||||
|
||||
p4 = Page(comments = [Comment(user=u2, comment="Heavy Metal song")])
|
||||
p4 = Page(comments=[Comment(user=u2, comment="Heavy Metal song")])
|
||||
p4.save()
|
||||
|
||||
self.assertEqual([p1, p2], list(Page.objects.filter(comments__user=u1)))
|
||||
@@ -1183,7 +1183,6 @@ class InstanceTest(unittest.TestCase):
|
||||
class Site(Document):
|
||||
page = EmbeddedDocumentField(Page)
|
||||
|
||||
|
||||
Site.drop_collection()
|
||||
site = Site(page=Page(log_message="Warning: Dummy message"))
|
||||
site.save()
|
||||
@@ -1328,7 +1327,8 @@ class InstanceTest(unittest.TestCase):
|
||||
occurs = ListField(EmbeddedDocumentField(Occurrence), default=list)
|
||||
|
||||
def raise_invalid_document():
|
||||
Word._from_son({'stem': [1,2,3], 'forms': 1, 'count': 'one', 'occurs': {"hello": None}})
|
||||
Word._from_son({'stem': [1, 2, 3], 'forms': 1, 'count': 'one',
|
||||
'occurs': {"hello": None}})
|
||||
|
||||
self.assertRaises(InvalidDocumentError, raise_invalid_document)
|
||||
|
||||
@@ -1350,7 +1350,7 @@ class InstanceTest(unittest.TestCase):
|
||||
reviewer = self.Person(name='Re Viewer')
|
||||
reviewer.save()
|
||||
|
||||
post = BlogPost(content = 'Watched some TV')
|
||||
post = BlogPost(content='Watched some TV')
|
||||
post.author = author
|
||||
post.reviewer = reviewer
|
||||
post.save()
|
||||
@@ -1432,7 +1432,6 @@ class InstanceTest(unittest.TestCase):
|
||||
author.delete()
|
||||
self.assertEqual(len(BlogPost.objects), 0)
|
||||
|
||||
|
||||
def test_reverse_delete_rule_cascade_triggers_pre_delete_signal(self):
|
||||
''' ensure the pre_delete signal is triggered upon a cascading deletion
|
||||
setup a blog post with content, an author and editor
|
||||
@@ -1627,7 +1626,7 @@ class InstanceTest(unittest.TestCase):
|
||||
u1 = User.objects.create()
|
||||
u2 = User.objects.create()
|
||||
u3 = User.objects.create()
|
||||
u4 = User() # New object
|
||||
u4 = User() # New object
|
||||
|
||||
b1 = BlogPost.objects.create()
|
||||
b2 = BlogPost.objects.create()
|
||||
@@ -1638,9 +1637,9 @@ class InstanceTest(unittest.TestCase):
|
||||
self.assertTrue(u1 in all_user_list)
|
||||
self.assertTrue(u2 in all_user_list)
|
||||
self.assertTrue(u3 in all_user_list)
|
||||
self.assertFalse(u4 in all_user_list) # New object
|
||||
self.assertFalse(b1 in all_user_list) # Other object
|
||||
self.assertFalse(b2 in all_user_list) # Other object
|
||||
self.assertFalse(u4 in all_user_list) # New object
|
||||
self.assertFalse(b1 in all_user_list) # Other object
|
||||
self.assertFalse(b2 in all_user_list) # Other object
|
||||
|
||||
# in Dict
|
||||
all_user_dic = {}
|
||||
@@ -1650,9 +1649,9 @@ class InstanceTest(unittest.TestCase):
|
||||
self.assertEqual(all_user_dic.get(u1, False), "OK")
|
||||
self.assertEqual(all_user_dic.get(u2, False), "OK")
|
||||
self.assertEqual(all_user_dic.get(u3, False), "OK")
|
||||
self.assertEqual(all_user_dic.get(u4, False), False) # New object
|
||||
self.assertEqual(all_user_dic.get(b1, False), False) # Other object
|
||||
self.assertEqual(all_user_dic.get(b2, False), False) # Other object
|
||||
self.assertEqual(all_user_dic.get(u4, False), False) # New object
|
||||
self.assertEqual(all_user_dic.get(b1, False), False) # Other object
|
||||
self.assertEqual(all_user_dic.get(b2, False), False) # Other object
|
||||
|
||||
# in Set
|
||||
all_user_set = set(User.objects.all())
|
||||
@@ -1730,7 +1729,6 @@ class InstanceTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(Doc.objects(archived=False).count(), 1)
|
||||
|
||||
|
||||
def test_can_save_false_values_dynamic(self):
|
||||
"""Ensures you can save False values on dynamic docs"""
|
||||
class Doc(DynamicDocument):
|
||||
@@ -1852,9 +1850,9 @@ class InstanceTest(unittest.TestCase):
|
||||
|
||||
self.assertEquals('testdb-2', B._meta.get('db_alias'))
|
||||
self.assertEquals('mongoenginetest',
|
||||
A._get_collection().database.name)
|
||||
A._get_collection().database.name)
|
||||
self.assertEquals('mongoenginetest2',
|
||||
B._get_collection().database.name)
|
||||
B._get_collection().database.name)
|
||||
|
||||
def test_db_alias_propagates(self):
|
||||
"""db_alias propagates?
|
||||
@@ -1920,21 +1918,21 @@ class InstanceTest(unittest.TestCase):
|
||||
|
||||
# Checks
|
||||
self.assertEqual(",".join([str(b) for b in Book.objects.all()]),
|
||||
"1,2,3,4,5,6,7,8,9")
|
||||
"1,2,3,4,5,6,7,8,9")
|
||||
# bob related books
|
||||
self.assertEqual(",".join([str(b) for b in Book.objects.filter(
|
||||
Q(extra__a=bob) |
|
||||
Q(author=bob) |
|
||||
Q(extra__b=bob))]),
|
||||
"1,2,3,4")
|
||||
Q(extra__a=bob) |
|
||||
Q(author=bob) |
|
||||
Q(extra__b=bob))]),
|
||||
"1,2,3,4")
|
||||
|
||||
# Susan & Karl related books
|
||||
self.assertEqual(",".join([str(b) for b in Book.objects.filter(
|
||||
Q(extra__a__all=[karl, susan]) |
|
||||
Q(author__all=[karl, susan]) |
|
||||
Q(extra__b__all=[
|
||||
karl.to_dbref(), susan.to_dbref()]))
|
||||
]), "1")
|
||||
Q(extra__a__all=[karl, susan]) |
|
||||
Q(author__all=[karl, susan]) |
|
||||
Q(extra__b__all=[
|
||||
karl.to_dbref(), susan.to_dbref()]))
|
||||
]), "1")
|
||||
|
||||
# $Where
|
||||
self.assertEqual(u",".join([str(b) for b in Book.objects.filter(
|
||||
@@ -1943,8 +1941,8 @@ class InstanceTest(unittest.TestCase):
|
||||
function(){
|
||||
return this.name == '1' ||
|
||||
this.name == '2';}"""
|
||||
}
|
||||
)]), "1,2")
|
||||
})]),
|
||||
"1,2")
|
||||
|
||||
def test_switch_db_instance(self):
|
||||
register_connection('testdb-1', 'mongoenginetest2')
|
||||
@@ -2020,7 +2018,6 @@ class InstanceTest(unittest.TestCase):
|
||||
self.assertEqual("Bar", user._data["foo"])
|
||||
self.assertEqual([1, 2, 3], user._data["data"])
|
||||
|
||||
|
||||
def test_spaces_in_keys(self):
|
||||
|
||||
class Embedded(DynamicEmbeddedDocument):
|
||||
@@ -2109,8 +2106,8 @@ class InstanceTest(unittest.TestCase):
|
||||
docs = ListField(EmbeddedDocumentField(Embedded))
|
||||
|
||||
classic_doc = Doc(doc_name="my doc", docs=[
|
||||
Embedded(name="embedded doc1"),
|
||||
Embedded(name="embedded doc2")])
|
||||
Embedded(name="embedded doc1"),
|
||||
Embedded(name="embedded doc2")])
|
||||
dict_doc = Doc(**{"doc_name": "my doc",
|
||||
"docs": [{"name": "embedded doc1"},
|
||||
{"name": "embedded doc2"}]})
|
||||
@@ -2118,5 +2115,82 @@ class InstanceTest(unittest.TestCase):
|
||||
self.assertEqual(classic_doc, dict_doc)
|
||||
self.assertEqual(classic_doc._data, dict_doc._data)
|
||||
|
||||
def test_positional_creation(self):
|
||||
"""Ensure that document may be created using positional arguments.
|
||||
"""
|
||||
person = self.Person("Test User", 42)
|
||||
self.assertEqual(person.name, "Test User")
|
||||
self.assertEqual(person.age, 42)
|
||||
|
||||
def test_mixed_creation(self):
|
||||
"""Ensure that document may be created using mixed arguments.
|
||||
"""
|
||||
person = self.Person("Test User", age=42)
|
||||
self.assertEqual(person.name, "Test User")
|
||||
self.assertEqual(person.age, 42)
|
||||
|
||||
def test_bad_mixed_creation(self):
|
||||
"""Ensure that document gives correct error when duplicating arguments
|
||||
"""
|
||||
def construct_bad_instance():
|
||||
return self.Person("Test User", 42, name="Bad User")
|
||||
|
||||
self.assertRaises(TypeError, construct_bad_instance)
|
||||
|
||||
def test_data_contains_id_field(self):
|
||||
"""Ensure that asking for _data returns 'id'
|
||||
"""
|
||||
class Person(Document):
|
||||
name = StringField()
|
||||
|
||||
Person.drop_collection()
|
||||
Person(name="Harry Potter").save()
|
||||
|
||||
person = Person.objects.first()
|
||||
self.assertTrue('id' in person._data.keys())
|
||||
self.assertEqual(person._data.get('id'), person.id)
|
||||
|
||||
def test_complex_nesting_document_and_embedded_document(self):
|
||||
|
||||
class Macro(EmbeddedDocument):
|
||||
value = DynamicField(default="UNDEFINED")
|
||||
|
||||
class Parameter(EmbeddedDocument):
|
||||
macros = MapField(EmbeddedDocumentField(Macro))
|
||||
|
||||
def expand(self):
|
||||
self.macros["test"] = Macro()
|
||||
|
||||
class Node(Document):
|
||||
parameters = MapField(EmbeddedDocumentField(Parameter))
|
||||
|
||||
def expand(self):
|
||||
self.flattened_parameter = {}
|
||||
for parameter_name, parameter in self.parameters.iteritems():
|
||||
parameter.expand()
|
||||
|
||||
class System(Document):
|
||||
name = StringField(required=True)
|
||||
nodes = MapField(ReferenceField(Node, dbref=False))
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
for node_name, node in self.nodes.iteritems():
|
||||
node.expand()
|
||||
node.save(*args, **kwargs)
|
||||
super(System, self).save(*args, **kwargs)
|
||||
|
||||
System.drop_collection()
|
||||
Node.drop_collection()
|
||||
|
||||
system = System(name="system")
|
||||
system.nodes["node"] = Node()
|
||||
system.save()
|
||||
system.nodes["node"].parameters["param"] = Parameter()
|
||||
system.save()
|
||||
|
||||
system = System.objects.first()
|
||||
self.assertEqual("UNDEFINED", system.nodes["node"].parameters["param"].macros["test"].value)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -130,8 +130,8 @@ class ValidatorErrorTest(unittest.TestCase):
|
||||
doc = Doc.objects.first()
|
||||
keys = doc._data.keys()
|
||||
self.assertEqual(2, len(keys))
|
||||
self.assertTrue('id' in keys)
|
||||
self.assertTrue('e' in keys)
|
||||
self.assertTrue('id' in keys)
|
||||
|
||||
doc.e.val = "OK"
|
||||
try:
|
||||
|
||||
@@ -145,6 +145,17 @@ class FieldTest(unittest.TestCase):
|
||||
self.assertEqual(1, TestDocument.objects(int_fld__ne=None).count())
|
||||
self.assertEqual(1, TestDocument.objects(float_fld__ne=None).count())
|
||||
|
||||
def test_long_ne_operator(self):
|
||||
class TestDocument(Document):
|
||||
long_fld = LongField()
|
||||
|
||||
TestDocument.drop_collection()
|
||||
|
||||
TestDocument(long_fld=None).save()
|
||||
TestDocument(long_fld=1).save()
|
||||
|
||||
self.assertEqual(1, TestDocument.objects(long_fld__ne=None).count())
|
||||
|
||||
def test_object_id_validation(self):
|
||||
"""Ensure that invalid values cannot be assigned to string fields.
|
||||
"""
|
||||
@@ -218,6 +229,23 @@ class FieldTest(unittest.TestCase):
|
||||
person.age = 'ten'
|
||||
self.assertRaises(ValidationError, person.validate)
|
||||
|
||||
def test_long_validation(self):
|
||||
"""Ensure that invalid values cannot be assigned to long fields.
|
||||
"""
|
||||
class TestDocument(Document):
|
||||
value = LongField(min_value=0, max_value=110)
|
||||
|
||||
doc = TestDocument()
|
||||
doc.value = 50
|
||||
doc.validate()
|
||||
|
||||
doc.value = -1
|
||||
self.assertRaises(ValidationError, doc.validate)
|
||||
doc.age = 120
|
||||
self.assertRaises(ValidationError, doc.validate)
|
||||
doc.age = 'ten'
|
||||
self.assertRaises(ValidationError, doc.validate)
|
||||
|
||||
def test_float_validation(self):
|
||||
"""Ensure that invalid values cannot be assigned to float fields.
|
||||
"""
|
||||
@@ -971,6 +999,24 @@ class FieldTest(unittest.TestCase):
|
||||
doc = self.db.test.find_one()
|
||||
self.assertEqual(doc['x']['DICTIONARY_KEY']['i'], 2)
|
||||
|
||||
def test_mapfield_numerical_index(self):
|
||||
"""Ensure that MapField accept numeric strings as indexes."""
|
||||
class Embedded(EmbeddedDocument):
|
||||
name = StringField()
|
||||
|
||||
class Test(Document):
|
||||
my_map = MapField(EmbeddedDocumentField(Embedded))
|
||||
|
||||
Test.drop_collection()
|
||||
|
||||
test = Test()
|
||||
test.my_map['1'] = Embedded(name='test')
|
||||
test.save()
|
||||
test.my_map['1'].name = 'test updated'
|
||||
test.save()
|
||||
|
||||
Test.drop_collection()
|
||||
|
||||
def test_map_field_lookup(self):
|
||||
"""Ensure MapField lookups succeed on Fields without a lookup method"""
|
||||
|
||||
@@ -2399,11 +2445,26 @@ class FieldTest(unittest.TestCase):
|
||||
self.assertTrue(1 in error_dict['comments'])
|
||||
self.assertTrue('content' in error_dict['comments'][1])
|
||||
self.assertEqual(error_dict['comments'][1]['content'],
|
||||
u'Field is required')
|
||||
u'Field is required')
|
||||
|
||||
post.comments[1].content = 'here we go'
|
||||
post.validate()
|
||||
|
||||
def test_email_field(self):
|
||||
class User(Document):
|
||||
email = EmailField()
|
||||
|
||||
user = User(email="ross@example.com")
|
||||
self.assertTrue(user.validate() is None)
|
||||
|
||||
user = User(email=("Kofq@rhom0e4klgauOhpbpNdogawnyIKvQS0wk2mjqrgGQ5S"
|
||||
"ucictfqpdkK9iS1zeFw8sg7s7cwAF7suIfUfeyueLpfosjn3"
|
||||
"aJIazqqWkm7.net"))
|
||||
self.assertTrue(user.validate() is None)
|
||||
|
||||
user = User(email='me@localhost')
|
||||
self.assertRaises(ValidationError, user.validate)
|
||||
|
||||
def test_email_field_honors_regex(self):
|
||||
class User(Document):
|
||||
email = EmailField(regex=r'\w+@example.com')
|
||||
|
||||
@@ -931,6 +931,11 @@ class QuerySetTest(unittest.TestCase):
|
||||
BlogPost.drop_collection()
|
||||
Blog.drop_collection()
|
||||
|
||||
def assertSequence(self, qs, expected):
|
||||
self.assertEqual(len(qs), len(expected))
|
||||
for i in range(len(qs)):
|
||||
self.assertEqual(qs[i], expected[i])
|
||||
|
||||
def test_ordering(self):
|
||||
"""Ensure default ordering is applied and can be overridden.
|
||||
"""
|
||||
@@ -957,14 +962,13 @@ class QuerySetTest(unittest.TestCase):
|
||||
|
||||
# get the "first" BlogPost using default ordering
|
||||
# from BlogPost.meta.ordering
|
||||
latest_post = BlogPost.objects.first()
|
||||
self.assertEqual(latest_post.title, "Blog Post #3")
|
||||
expected = [blog_post_3, blog_post_2, blog_post_1]
|
||||
self.assertSequence(BlogPost.objects.all(), expected)
|
||||
|
||||
# override default ordering, order BlogPosts by "published_date"
|
||||
first_post = BlogPost.objects.order_by("+published_date").first()
|
||||
self.assertEqual(first_post.title, "Blog Post #1")
|
||||
|
||||
BlogPost.drop_collection()
|
||||
qs = BlogPost.objects.order_by("+published_date")
|
||||
expected = [blog_post_1, blog_post_2, blog_post_3]
|
||||
self.assertSequence(qs, expected)
|
||||
|
||||
def test_find_embedded(self):
|
||||
"""Ensure that an embedded document is properly returned from a query.
|
||||
@@ -1505,8 +1509,8 @@ class QuerySetTest(unittest.TestCase):
|
||||
def test_order_by(self):
|
||||
"""Ensure that QuerySets may be ordered.
|
||||
"""
|
||||
self.Person(name="User A", age=20).save()
|
||||
self.Person(name="User B", age=40).save()
|
||||
self.Person(name="User A", age=20).save()
|
||||
self.Person(name="User C", age=30).save()
|
||||
|
||||
names = [p.name for p in self.Person.objects.order_by('-age')]
|
||||
@@ -1521,11 +1525,67 @@ class QuerySetTest(unittest.TestCase):
|
||||
ages = [p.age for p in self.Person.objects.order_by('-name')]
|
||||
self.assertEqual(ages, [30, 40, 20])
|
||||
|
||||
def test_order_by_optional(self):
|
||||
class BlogPost(Document):
|
||||
title = StringField()
|
||||
published_date = DateTimeField(required=False)
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
blog_post_3 = BlogPost(title="Blog Post #3",
|
||||
published_date=datetime(2010, 1, 6, 0, 0 ,0))
|
||||
blog_post_2 = BlogPost(title="Blog Post #2",
|
||||
published_date=datetime(2010, 1, 5, 0, 0 ,0))
|
||||
blog_post_4 = BlogPost(title="Blog Post #4",
|
||||
published_date=datetime(2010, 1, 7, 0, 0 ,0))
|
||||
blog_post_1 = BlogPost(title="Blog Post #1", published_date=None)
|
||||
|
||||
blog_post_3.save()
|
||||
blog_post_1.save()
|
||||
blog_post_4.save()
|
||||
blog_post_2.save()
|
||||
|
||||
expected = [blog_post_1, blog_post_2, blog_post_3, blog_post_4]
|
||||
self.assertSequence(BlogPost.objects.order_by('published_date'),
|
||||
expected)
|
||||
self.assertSequence(BlogPost.objects.order_by('+published_date'),
|
||||
expected)
|
||||
|
||||
expected.reverse()
|
||||
self.assertSequence(BlogPost.objects.order_by('-published_date'),
|
||||
expected)
|
||||
|
||||
def test_order_by_list(self):
|
||||
class BlogPost(Document):
|
||||
title = StringField()
|
||||
published_date = DateTimeField(required=False)
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
blog_post_1 = BlogPost(title="A",
|
||||
published_date=datetime(2010, 1, 6, 0, 0 ,0))
|
||||
blog_post_2 = BlogPost(title="B",
|
||||
published_date=datetime(2010, 1, 6, 0, 0 ,0))
|
||||
blog_post_3 = BlogPost(title="C",
|
||||
published_date=datetime(2010, 1, 7, 0, 0 ,0))
|
||||
|
||||
blog_post_2.save()
|
||||
blog_post_3.save()
|
||||
blog_post_1.save()
|
||||
|
||||
qs = BlogPost.objects.order_by('published_date', 'title')
|
||||
expected = [blog_post_1, blog_post_2, blog_post_3]
|
||||
self.assertSequence(qs, expected)
|
||||
|
||||
qs = BlogPost.objects.order_by('-published_date', '-title')
|
||||
expected.reverse()
|
||||
self.assertSequence(qs, expected)
|
||||
|
||||
def test_order_by_chaining(self):
|
||||
"""Ensure that an order_by query chains properly and allows .only()
|
||||
"""
|
||||
self.Person(name="User A", age=20).save()
|
||||
self.Person(name="User B", age=40).save()
|
||||
self.Person(name="User A", age=20).save()
|
||||
self.Person(name="User C", age=30).save()
|
||||
|
||||
only_age = self.Person.objects.order_by('-age').only('age')
|
||||
@@ -1537,6 +1597,21 @@ class QuerySetTest(unittest.TestCase):
|
||||
self.assertEqual(names, [None, None, None])
|
||||
self.assertEqual(ages, [40, 30, 20])
|
||||
|
||||
qs = self.Person.objects.all().order_by('-age')
|
||||
qs = qs.limit(10)
|
||||
ages = [p.age for p in qs]
|
||||
self.assertEqual(ages, [40, 30, 20])
|
||||
|
||||
qs = self.Person.objects.all().limit(10)
|
||||
qs = qs.order_by('-age')
|
||||
ages = [p.age for p in qs]
|
||||
self.assertEqual(ages, [40, 30, 20])
|
||||
|
||||
qs = self.Person.objects.all().skip(0)
|
||||
qs = qs.order_by('-age')
|
||||
ages = [p.age for p in qs]
|
||||
self.assertEqual(ages, [40, 30, 20])
|
||||
|
||||
def test_confirm_order_by_reference_wont_work(self):
|
||||
"""Ordering by reference is not possible. Use map / reduce.. or
|
||||
denormalise"""
|
||||
@@ -2065,6 +2140,25 @@ class QuerySetTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(Foo.objects.distinct("bar"), [bar])
|
||||
|
||||
def test_distinct_handles_db_field(self):
|
||||
"""Ensure that distinct resolves field name to db_field as expected.
|
||||
"""
|
||||
class Product(Document):
|
||||
product_id = IntField(db_field='pid')
|
||||
|
||||
Product.drop_collection()
|
||||
|
||||
Product(product_id=1).save()
|
||||
Product(product_id=2).save()
|
||||
Product(product_id=1).save()
|
||||
|
||||
self.assertEqual(set(Product.objects.distinct('product_id')),
|
||||
set([1, 2]))
|
||||
self.assertEqual(set(Product.objects.distinct('pid')),
|
||||
set([1, 2]))
|
||||
|
||||
Product.drop_collection()
|
||||
|
||||
def test_custom_manager(self):
|
||||
"""Ensure that custom QuerySetManager instances work as expected.
|
||||
"""
|
||||
|
||||
@@ -7,7 +7,7 @@ from bson import DBRef, ObjectId
|
||||
|
||||
from mongoengine import *
|
||||
from mongoengine.connection import get_db
|
||||
from mongoengine.context_managers import query_counter, no_dereference
|
||||
from mongoengine.context_managers import query_counter
|
||||
|
||||
|
||||
class FieldTest(unittest.TestCase):
|
||||
@@ -212,8 +212,9 @@ class FieldTest(unittest.TestCase):
|
||||
|
||||
# Migrate the data
|
||||
for g in Group.objects():
|
||||
g.author = g.author
|
||||
g.members = g.members
|
||||
# Explicitly mark as changed so resets
|
||||
g._mark_as_changed('author')
|
||||
g._mark_as_changed('members')
|
||||
g.save()
|
||||
|
||||
group = Group.objects.first()
|
||||
@@ -1120,6 +1121,37 @@ class FieldTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(q, 2)
|
||||
|
||||
def test_tuples_as_tuples(self):
|
||||
"""
|
||||
Ensure that tuples remain tuples when they are
|
||||
inside a ComplexBaseField
|
||||
"""
|
||||
from mongoengine.base import BaseField
|
||||
|
||||
class EnumField(BaseField):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super(EnumField, self).__init__(**kwargs)
|
||||
|
||||
def to_mongo(self, value):
|
||||
return value
|
||||
|
||||
def to_python(self, value):
|
||||
return tuple(value)
|
||||
|
||||
class TestDoc(Document):
|
||||
items = ListField(EnumField())
|
||||
|
||||
TestDoc.drop_collection()
|
||||
tuples = [(100, 'Testing')]
|
||||
doc = TestDoc()
|
||||
doc.items = tuples
|
||||
doc.save()
|
||||
x = TestDoc.objects().get()
|
||||
self.assertTrue(x is not None)
|
||||
self.assertTrue(len(x.items) == 1)
|
||||
self.assertTrue(tuple(x.items[0]) in tuples)
|
||||
self.assertTrue(x.items[0] in tuples)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user