def _get_field(model, name): # Create a fake query object so we can easily work out what field # type we are dealing with qs = Query(model) parts = name.split(LOOKUP_SEP) # The following is borrowed from the innards of Query.add_filter - it strips out __gt, __exact et al. num_parts = len(parts) if num_parts > 1 and parts[-1] in QUERY_TERMS: # Traverse the lookup query to distinguish related fields from # lookup types. for counter, field_name in enumerate(parts, 1): try: lookup_field = model._meta.get_field(field_name) except FieldDoesNotExist: # Not a field. Bail out. parts.pop() break # Unless we're at the end of the list of lookups, let's attempt # to continue traversing relations. if counter < num_parts: try: model = lookup_field.rel.to except AttributeError: # Not a related field. Bail out. parts.pop() break return qs.names_to_path(parts, qs.get_meta(), True, fail_on_missing=False)[1]
def _get_field(model, name): # Create a fake query object so we can easily work out what field # type we are dealing with parts = name.split(LOOKUP_SEP) # The following is borrowed from the innards of Query.add_filter - it strips out __gt, __exact et al. num_parts = len(parts) if num_parts > 1 and parts[-1] in Query.query_terms: # Traverse the lookup query to distinguish related fields from # lookup types. for counter, field_name in enumerate(parts, 1): try: lookup_field = model._meta.get_field(field_name) except FieldDoesNotExist: # Not a field. Bail out. parts.pop() break # Unless we're at the end of the list of lookups, let's attempt # to continue traversing relations. if counter < num_parts: try: model = lookup_field.rel.to except AttributeError: # Not a related field. Bail out. parts.pop() break qs = Query(model) return qs.names_to_path(parts, qs.get_meta(), True, fail_on_missing=False)[1]
def _get_field(model, name): from django.db.models.fields import FieldDoesNotExist # Create a fake query object so we can easily work out what field # type we are dealing with qs = Query(model) opts = qs.get_meta() alias = qs.get_initial_alias() parts = name.split(LOOKUP_SEP) # The following is borrowed from the innards of Query.add_filter - it strips out __gt, __exact et al. num_parts = len(parts) if num_parts > 1 and parts[-1] in qs.query_terms: # Traverse the lookup query to distinguish related fields from # lookup types. for counter, field_name in enumerate(parts, 1): try: lookup_field = model._meta.get_field(field_name) except FieldDoesNotExist: # Not a field. Bail out. parts.pop() break # Unless we're at the end of the list of lookups, let's attempt # to continue traversing relations. if counter < num_parts: try: model = lookup_field.rel.to except AttributeError: # Not a related field. Bail out. parts.pop() break return resolve_field(qs, parts, opts, alias)
def _get_field(model, name): from django.db.models.fields import FieldDoesNotExist # Create a fake query object so we can easily work out what field # type we are dealing with qs = Query(model) opts = qs.get_meta() alias = qs.get_initial_alias() parts = name.split(LOOKUP_SEP) # The following is borrowed from the innards of Query.add_filter - it strips out __gt, __exact et al. num_parts = len(parts) if num_parts > 1 and parts[-1] in qs.query_terms: # Traverse the lookup query to distinguish related fields from # lookup types. for counter, field_name in enumerate(parts, 1): try: lookup_field = model._meta.get_field(field_name) except FieldDoesNotExist: # Not a field. Bail out. parts.pop() break # Unless we're at the end of the list of lookups, let's attempt # to continue traversing relations. if counter < num_parts: try: model = lookup_field.rel.to except AttributeError: # Not a related field. Bail out. parts.pop() break return resolve_field(qs, parts, opts, alias)
def follow_model_field_lookup(model, lookup): """ Follow a model lookup `foreignkey__foreignkey__field` in the same way that Django QuerySet.filter() does, returning the final models.Field. """ query = Query(model) lookup_splitted = lookup.split(LOOKUP_SEP) _, field, _, _ = query.names_to_path(lookup_splitted, query.get_meta()) return field
def _get_field(model, name): if django.VERSION[0] >= 1 and django.VERSION[1] >= 8: # Django 1.8+ - can use something like # expression.output_field.get_internal_field() == 'Money..' raise NotImplementedError("Django 1.8+ support is not implemented.") from django.db.models.fields import FieldDoesNotExist # Create a fake query object so we can easily work out what field # type we are dealing with qs = Query(model) opts = qs.get_meta() alias = qs.get_initial_alias() parts = name.split(LOOKUP_SEP) # The following is borrowed from the innards of Query.add_filter - it strips out __gt, __exact et al. num_parts = len(parts) if num_parts > 1 and parts[-1] in qs.query_terms: # Traverse the lookup query to distinguish related fields from # lookup types. lookup_model = model for counter, field_name in enumerate(parts): try: lookup_field = lookup_model._meta.get_field(field_name) except FieldDoesNotExist: # Not a field. Bail out. parts.pop() break # Unless we're at the end of the list of lookups, let's attempt # to continue traversing relations. if (counter + 1) < num_parts: try: lookup_model = lookup_field.rel.to except AttributeError: # Not a related field. Bail out. parts.pop() break if django.VERSION[0] >= 1 and django.VERSION[1] in (6, 7): # Django 1.6-1.7 field = qs.setup_joins(parts, opts, alias)[0] else: # Django 1.4-1.5 field = qs.setup_joins(parts, opts, alias, False)[0] return field