make the delete rules nicer and safer in BaseQuerySet.delete

This commit is contained in:
Stefan Wojcik 2016-12-10 13:50:52 -05:00
parent 566e8ee801
commit 30ebe7c11e

View File

@ -422,15 +422,15 @@ class BaseQuerySet(object):
return cnt return cnt
delete_rules = doc._meta.get('delete_rules') or {} delete_rules = doc._meta.get('delete_rules') or {}
delete_rules = list(delete_rules.items())
# Check for DENY rules before actually deleting/nullifying any other # Check for DENY rules before actually deleting/nullifying any other
# references # references
for rule_entry in delete_rules: for rule_entry, rule in delete_rules:
document_cls, field_name = rule_entry document_cls, field_name = rule_entry
if document_cls._meta.get('abstract'): if document_cls._meta.get('abstract'):
continue continue
rule = doc._meta['delete_rules'][rule_entry]
if rule == DENY: if rule == DENY:
refs = document_cls.objects(**{field_name + '__in': self}) refs = document_cls.objects(**{field_name + '__in': self})
if refs.limit(1).count() > 0: if refs.limit(1).count() > 0:
@ -440,12 +440,11 @@ class BaseQuerySet(object):
) )
# Check all the other rules # Check all the other rules
for rule_entry in delete_rules: for rule_entry, rule in delete_rules:
document_cls, field_name = rule_entry document_cls, field_name = rule_entry
if document_cls._meta.get('abstract'): if document_cls._meta.get('abstract'):
continue continue
rule = doc._meta['delete_rules'][rule_entry]
if rule == CASCADE: if rule == CASCADE:
cascade_refs = set() if cascade_refs is None else cascade_refs cascade_refs = set() if cascade_refs is None else cascade_refs
# Handle recursive reference # Handle recursive reference