Added example of bi directional delete rules + test
refs mongoengine/mongoengine#15
This commit is contained in:
parent
2aa8b04c21
commit
bbefd0fdf9
@ -616,6 +616,17 @@ class ReferenceField(BaseField):
|
|||||||
* CASCADE - Deletes the documents associated with the reference.
|
* CASCADE - Deletes the documents associated with the reference.
|
||||||
* DENY - Prevent the deletion of the reference object.
|
* DENY - Prevent the deletion of the reference object.
|
||||||
|
|
||||||
|
Alternative syntax for registering delete rules (useful when implementing
|
||||||
|
bi-directional delete rules)
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Bar(Document):
|
||||||
|
content = StringField()
|
||||||
|
foo = ReferenceField('Foo')
|
||||||
|
|
||||||
|
Bar.register_delete_rule(Foo, 'bar', NULLIFY)
|
||||||
|
|
||||||
.. versionchanged:: 0.5 added `reverse_delete_rule`
|
.. versionchanged:: 0.5 added `reverse_delete_rule`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -2496,6 +2496,40 @@ class DocumentTest(unittest.TestCase):
|
|||||||
author.delete()
|
author.delete()
|
||||||
self.assertEqual(len(BlogPost.objects), 0)
|
self.assertEqual(len(BlogPost.objects), 0)
|
||||||
|
|
||||||
|
def test_two_way_reverse_delete_rule(self):
|
||||||
|
"""Ensure that Bi-Directional relationships work with
|
||||||
|
reverse_delete_rule
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Bar(Document):
|
||||||
|
content = StringField()
|
||||||
|
foo = ReferenceField('Foo')
|
||||||
|
|
||||||
|
class Foo(Document):
|
||||||
|
content = StringField()
|
||||||
|
bar = ReferenceField(Bar)
|
||||||
|
|
||||||
|
Bar.register_delete_rule(Foo, 'bar', NULLIFY)
|
||||||
|
Foo.register_delete_rule(Bar, 'foo', NULLIFY)
|
||||||
|
|
||||||
|
|
||||||
|
Bar.drop_collection()
|
||||||
|
Foo.drop_collection()
|
||||||
|
|
||||||
|
b = Bar(content="Hello")
|
||||||
|
b.save()
|
||||||
|
|
||||||
|
f = Foo(content="world", bar=b)
|
||||||
|
f.save()
|
||||||
|
|
||||||
|
b.foo = f
|
||||||
|
b.save()
|
||||||
|
|
||||||
|
f.delete()
|
||||||
|
|
||||||
|
self.assertEqual(len(Bar.objects), 1) # No effect on the BlogPost
|
||||||
|
self.assertEqual(Bar.objects.get().foo, None)
|
||||||
|
|
||||||
def test_invalid_reverse_delete_rules_raise_errors(self):
|
def test_invalid_reverse_delete_rules_raise_errors(self):
|
||||||
|
|
||||||
def throw_invalid_document_error():
|
def throw_invalid_document_error():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user