mirror of
https://github.com/django/django.git
synced 2025-06-05 03:29:12 +00:00
magic-removal: Added checks to prevent creation of models with related/m2m field names that collide with defined field names
git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2146 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
ce71979e53
commit
feee6d8805
@ -27,6 +27,8 @@ get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
|
|||||||
|
|
||||||
class FieldDoesNotExist(Exception):
|
class FieldDoesNotExist(Exception):
|
||||||
pass
|
pass
|
||||||
|
class FieldCollision(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
def manipulator_validator_unique(f, opts, self, field_data, all_data):
|
def manipulator_validator_unique(f, opts, self, field_data, all_data):
|
||||||
"Validates that the value is unique for this field."
|
"Validates that the value is unique for this field."
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from django.db.models.related import RelatedObject
|
from django.db.models.related import RelatedObject
|
||||||
from django.db.models.fields.related import ManyToMany
|
from django.db.models.fields.related import ManyToMany
|
||||||
from django.db.models.fields import AutoField, FieldDoesNotExist
|
from django.db.models.fields import AutoField, FieldDoesNotExist, FieldCollision
|
||||||
from django.db.models.loading import get_models
|
from django.db.models.loading import get_models
|
||||||
from django.db.models.query import orderlist2sql
|
from django.db.models.query import orderlist2sql
|
||||||
from bisect import bisect
|
from bisect import bisect
|
||||||
@ -123,7 +123,23 @@ class Options:
|
|||||||
for klass in get_models():
|
for klass in get_models():
|
||||||
for f in klass._meta.fields:
|
for f in klass._meta.fields:
|
||||||
if f.rel and self == f.rel.to._meta:
|
if f.rel and self == f.rel.to._meta:
|
||||||
rel_objs.append(RelatedObject(f.rel.to, klass, f))
|
rel_obj = RelatedObject(f.rel.to, klass, f)
|
||||||
|
# Check to see if the new related field will clash with any
|
||||||
|
# existing fields, m2m fields, m2m related objects or related objects
|
||||||
|
if rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.fields]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing field on ' + self.object_name
|
||||||
|
elif rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.many_to_many]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing m2m field on ' + self.object_name
|
||||||
|
elif rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.get_all_related_many_to_many_objects()]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing related m2m field on ' + self.object_name
|
||||||
|
elif rel_obj.OLD_get_accessor_name() in [r.OLD_get_accessor_name() for r in rel_objs]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing related field on ' + self.object_name
|
||||||
|
else:
|
||||||
|
rel_objs.append(rel_obj)
|
||||||
self._all_related_objects = rel_objs
|
self._all_related_objects = rel_objs
|
||||||
return rel_objs
|
return rel_objs
|
||||||
|
|
||||||
@ -157,7 +173,23 @@ class Options:
|
|||||||
for klass in get_models():
|
for klass in get_models():
|
||||||
for f in klass._meta.many_to_many:
|
for f in klass._meta.many_to_many:
|
||||||
if f.rel and self == f.rel.to._meta:
|
if f.rel and self == f.rel.to._meta:
|
||||||
rel_objs.append(RelatedObject(f.rel.to, klass, f))
|
rel_obj = RelatedObject(f.rel.to, klass, f)
|
||||||
|
# Check to see if the new related field will clash with any
|
||||||
|
# existing fields, m2m fields, m2m related objects or related objects
|
||||||
|
if rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.fields]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing field on ' + self.object_name
|
||||||
|
elif rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.many_to_many]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing m2m field on ' + self.object_name
|
||||||
|
elif rel_obj.OLD_get_accessor_name() in [r.OLD_get_accessor_name() for r in f.rel.to._meta.get_all_related_objects()]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing related field on ' + self.object_name
|
||||||
|
elif rel_obj.OLD_get_accessor_name() in [r.name for r in rel_objs]:
|
||||||
|
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
|
||||||
|
'.' + f.name + ' clashes with existing related m2m field on ' + self.object_name
|
||||||
|
else:
|
||||||
|
rel_objs.append(rel_obj)
|
||||||
self._all_related_many_to_many_objects = rel_objs
|
self._all_related_many_to_many_objects = rel_objs
|
||||||
return rel_objs
|
return rel_objs
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user