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)