1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | from django.db.models.fields import FieldDoesNotExist
import copy
from django.db.models.fields.related import ForeignKey
def get_field(self, name, many_to_many=True):
"""
Returns the requested field by name. Raises FieldDoesNotExist on error.
"""
to_search = many_to_many and (self.fields + self.many_to_many) or self.fields
if hasattr(self, '_copy_fields'):
to_search += self._copy_fields
for f in to_search:
if f.name == name:
return f
if not name.startswith('__') and '__' in name:
f = None
model = self
path = name.split('__')
for field_name in path:
f = model._get_field(field_name)
if isinstance(f, ForeignKey):
model = f.rel.to._meta
f = copy.deepcopy(f)
f.name = name
if not hasattr(self, "_copy_fields"):
self._copy_fields = list()
self._copy_fields.append(f)
return f
raise FieldDoesNotExist, '%s has no field named %r' % (self.object_name, name)
setattr(options.Options, '_get_field', options.Options.get_field.im_func)
setattr(options.Options, 'get_field', get_field)
|
Comments