Improved validation of (Generic)Reference fields

This commit is contained in:
Ross Lawley
2011-06-16 15:25:09 +01:00
parent 5e8604967c
commit 5cc9188c5b
2 changed files with 35 additions and 0 deletions

View File

@@ -604,6 +604,11 @@ class ReferenceField(BaseField):
def validate(self, value):
assert isinstance(value, (self.document_type, pymongo.dbref.DBRef))
if isinstance(value, Document) and value.id is None:
raise ValidationError('You can only reference documents once '
'they have been saved to the database')
def lookup_member(self, member_name):
return self.document_type._fields.get(member_name)
@@ -628,6 +633,15 @@ class GenericReferenceField(BaseField):
return super(GenericReferenceField, self).__get__(instance, owner)
def validate(self, value):
if not isinstance(value, (Document, pymongo.dbref.DBRef)):
raise ValidationError('GenericReferences can only contain documents')
# We need the id from the saved object to create the DBRef
if isinstance(value, Document) and value.id is None:
raise ValidationError('You can only reference documents once '
'they have been saved to the database')
def dereference(self, value):
doc_cls = get_document(value['_cls'])
reference = value['_ref']