def test_lazy_reference_query_conversion(self): """Ensure that LazyReferenceFields can be queried using objects and values of the type of the primary key of the referenced object. """ class Member(Document): user_num = IntField(primary_key=True) class BlogPost(Document): title = StringField() author = LazyReferenceField(Member, dbref=False) Member.drop_collection() BlogPost.drop_collection() m1 = Member(user_num=1) m1.save() m2 = Member(user_num=2) m2.save() post1 = BlogPost(title='post 1', author=m1) post1.save() post2 = BlogPost(title='post 2', author=m2) post2.save() post = BlogPost.objects(author=m1).first() self.assertEqual(post.id, post1.id) post = BlogPost.objects(author=m2).first() self.assertEqual(post.id, post2.id) # Same thing by passing a LazyReference instance post = BlogPost.objects(author=LazyReference(Member, m2.pk)).first() self.assertEqual(post.id, post2.id)
def test_generic_lazy_reference_query_conversion(self): class Member(Document): user_num = IntField(primary_key=True) class BlogPost(Document): title = StringField() author = GenericLazyReferenceField() Member.drop_collection() BlogPost.drop_collection() m1 = Member(user_num=1) m1.save() m2 = Member(user_num=2) m2.save() post1 = BlogPost(title="post 1", author=m1) post1.save() post2 = BlogPost(title="post 2", author=m2) post2.save() post = BlogPost.objects(author=m1).first() assert post.id == post1.id post = BlogPost.objects(author=m2).first() assert post.id == post2.id # Same thing by passing a LazyReference instance post = BlogPost.objects(author=LazyReference(Member, m2.pk)).first() assert post.id == post2.id
def test_lazy_reference_equality(self): class Animal(Document): name = StringField() tag = StringField() Animal.drop_collection() animal = Animal(name="Leopard", tag="heavy").save() animalref = LazyReference(Animal, animal.pk) assert animal == animalref assert animalref == animal other_animalref = LazyReference(Animal, ObjectId("54495ad94c934721ede76f90")) assert animal != other_animalref assert other_animalref != animal
def test_lazy_reference_bad_set(self): class Animal(Document): name = StringField() tag = StringField() class Ocurrence(Document): person = StringField() animal = LazyReferenceField(Animal) Animal.drop_collection() Ocurrence.drop_collection() class BadDoc(Document): pass animal = Animal(name="Leopard", tag="heavy").save() baddoc = BadDoc().save() for bad in ( 42, "foo", baddoc, DBRef(baddoc._get_collection_name(), animal.pk), LazyReference(BadDoc, animal.pk), ): with pytest.raises(ValidationError): Ocurrence(person="test", animal=bad).save()
def test_generic_lazy_reference_set(self): class Animal(Document): meta = {"allow_inheritance": True} name = StringField() tag = StringField() class Ocurrence(Document): person = StringField() animal = GenericLazyReferenceField() Animal.drop_collection() Ocurrence.drop_collection() class SubAnimal(Animal): nick = StringField() animal = Animal(name="Leopard", tag="heavy").save() sub_animal = SubAnimal(nick="doggo", name="dog").save() for ref in ( animal, LazyReference(Animal, animal.pk), { "_cls": "Animal", "_ref": DBRef(animal._get_collection_name(), animal.pk) }, sub_animal, LazyReference(SubAnimal, sub_animal.pk), { "_cls": "SubAnimal", "_ref": DBRef(sub_animal._get_collection_name(), sub_animal.pk), }, ): p = Ocurrence(person="test", animal=ref).save() p.reload() assert isinstance(p.animal, (LazyReference, Document)) p.animal.fetch()
def test_generic_lazy_reference_set(self): class Animal(Document): meta = {'allow_inheritance': True} name = StringField() tag = StringField() class Ocurrence(Document): person = StringField() animal = GenericLazyReferenceField() Animal.drop_collection() Ocurrence.drop_collection() class SubAnimal(Animal): nick = StringField() animal = Animal(name="Leopard", tag="heavy").save() sub_animal = SubAnimal(nick='doggo', name='dog').save() for ref in ( animal, LazyReference(Animal, animal.pk), { '_cls': 'Animal', '_ref': DBRef(animal._get_collection_name(), animal.pk) }, sub_animal, LazyReference(SubAnimal, sub_animal.pk), { '_cls': 'SubAnimal', '_ref': DBRef(sub_animal._get_collection_name(), sub_animal.pk) }, ): p = Ocurrence(person="test", animal=ref).save() p.reload() self.assertIsInstance(p.animal, (LazyReference, Document)) p.animal.fetch()
def test_generic_lazy_reference_bad_set(self): class Animal(Document): name = StringField() tag = StringField() class Ocurrence(Document): person = StringField() animal = GenericLazyReferenceField(choices=['Animal']) Animal.drop_collection() Ocurrence.drop_collection() class BadDoc(Document): pass animal = Animal(name="Leopard", tag="heavy").save() baddoc = BadDoc().save() for bad in (42, 'foo', baddoc, LazyReference(BadDoc, animal.pk)): with self.assertRaises(ValidationError): p = Ocurrence(person="test", animal=bad).save()