More the deletion code over to the QuerySet object.

The Document object doens't have any delete_rule specific code anymore,
and leverages the QuerySet's ability to deny/cascade/nullify its
relations.
This commit is contained in:
Vincent Driessen
2010-12-13 12:36:24 -08:00
parent 3c98a4bff5
commit 07dae64d66
4 changed files with 65 additions and 22 deletions

View File

@@ -99,26 +99,6 @@ class Document(BaseDocument):
:param safe: check if the operation succeeded before returning
"""
# Check for DENY rules before actually deleting/nullifying any other
# references
for rule_entry in self._meta['delete_rules']:
document_cls, field_name = rule_entry
rule = self._meta['delete_rules'][rule_entry]
if rule == DENY and document_cls.objects(**{field_name: self.id}).count() > 0:
msg = u'Could not delete document (at least %s.%s refers to it)' % \
(document_cls.__name__, field_name)
raise OperationError(msg)
for rule_entry in self._meta['delete_rules']:
document_cls, field_name = rule_entry
rule = self._meta['delete_rules'][rule_entry]
if rule == CASCADE:
document_cls.objects(**{field_name: self.id}).delete(safe=safe)
elif rule == NULLIFY:
document_cls.objects(**{field_name:
self.id}).update(**{'unset__%s' % field_name: 1})
id_field = self._meta['id_field']
object_id = self._fields[id_field].to_mongo(self[id_field])
try: