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.
|
||||
* 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`
|
||||
"""
|
||||
|
||||
|
@ -2496,6 +2496,40 @@ class DocumentTest(unittest.TestCase):
|
||||
author.delete()
|
||||
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 throw_invalid_document_error():
|
||||
|
Loading…
x
Reference in New Issue
Block a user