def get_url(self, obj, view_name, request, format):
        """
        Given an object, return the URL that hyperlinks to the object.

        May raise a `NoReverseMatch` if the `view_name` and `lookup_field`
        attributes are not configured to correctly match the URL conf.
        """
        defaults = {}
        if self.parent.opts.defaults:
            defaults.update(self.parent.opts.defaults)
        if self.defaults:
            defaults.update(self.defaults)

        lookup_field = getattr(obj, self.lookup_field)
        kwargs = {self.lookup_field: lookup_field}
        kwargs.update(defaults)
        try:
            return reverse(view_name, kwargs=kwargs, request=request, format=format)
        except NoReverseMatch:
            pass

        if self.pk_url_kwarg != 'pk':
            # Only try pk lookup if it has been explicitly set.
            # Otherwise, the default `lookup_field = 'pk'` has us covered.
            kwargs = {self.pk_url_kwarg: obj.pk}
            kwargs.update(defaults)
            try:
                return reverse(view_name, kwargs=kwargs, request=request, format=format)
            except NoReverseMatch:
                pass

        slug = getattr(obj, self.slug_field, None)
        if slug:
            # Only use slug lookup if a slug field exists on the model
            kwargs = {self.slug_url_kwarg: slug}
            kwargs.update(defaults)
            try:
                return reverse(view_name, kwargs=kwargs, request=request, format=format)
            except NoReverseMatch:
                pass

        raise NoReverseMatch()
    def field_to_native(self, obj, field_name):
        defaults = {}
        if self.parent.opts.defaults:
            defaults.update(self.parent.opts.defaults)
        if self.defaults:
            defaults.update(self.defaults)

        if self.pk_query_kwarg:
            request = self.context.get('request', None)
            format = self.format or self.context.get('format', None)
            #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace
            view_name = self.view_name or self.parent.opts.view_name
            #if view_namespace:
            #    view_name = "%(namespace)s:%(view)s" % {
            #        'view':view_name,
            #        'namespace':view_namespace
            #    }
    
            pk = getattr(obj, 'pk')
            
            try:
                url = reverse(view_name, kwargs=defaults, request=request, format=format)
                return  "%(url)s?%(query_kwarg)s=%(query_value)s" % {
                        'url': url,
                        'query_kwarg': self.pk_query_kwarg,
                        'query_value': pk
                        }
            except NoReverseMatch:
                pass
    
            raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
        elif self.slug_query_kwarg:
            request = self.context.get('request', None)
            format = self.format or self.context.get('format', None)
            #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace
            view_name = self.view_name or self.parent.opts.view_name
            #if view_namespace:
            #    view_name = "%(namespace)s:%(view)s" % {
            #        'view':view_name,
            #        'namespace':view_namespace
            #    }
    
            slug = getattr(obj, self.slug_field, None)
    
            if not slug:
                raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
    
            
            try:
                url = reverse(view_name, kwargs=defaults, request=request, format=format)
                return  "%(url)s?%(query_kwarg)s=%(query_value)s" % {
                        'url': url,
                        'query_kwarg': self.slug_query_kwarg,
                        'query_value': slug
                        }
            except NoReverseMatch:
                pass
    
            raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
        else:
            request = self.context.get('request', None)
            format = self.format or self.context.get('format', None)
            view_name = self.view_name or self.parent.opts.view_name
            kwargs = {self.pk_url_kwarg: obj.pk}
            kwargs.update(defaults)
            try:
                return reverse(view_name, kwargs=kwargs, request=request, format=format)
            except NoReverseMatch:
                pass
    
            kwargs = {}
            for key, value in self.url_kwarg_lookup.items():
                kwargs[key] = value(obj) if hasattr(value, '__call__') else getattr(obj, value, None)
            
            kwargs.update(defaults)
            try:
                return reverse(self.view_name, kwargs=kwargs, request=request, format=format)
            except NoReverseMatch:
                pass
            

            slug = getattr(obj, self.slug_field, None)
    
            if not slug:
                raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
    
            kwargs = {self.slug_url_kwarg: slug}
            kwargs.update(defaults)
            try:
                return reverse(self.view_name, kwargs=kwargs, request=request, format=format)
            except NoReverseMatch:
                pass
    
    
            kwargs = {self.pk_url_kwarg: obj.pk, self.slug_url_kwarg: slug}
            try:
                return reverse(self.view_name, kwargs=kwargs, request=request, format=format)
            except NoReverseMatch:
                pass
    
            raise ValidationError('Could not resolve URL for field using view name "%s"', view_name)
 def field_to_native(self, obj, field_name):
     
     if self.pk_query_kwarg:
         request = self.context.get('request', None)
         format = self.format or self.context.get('format', None)
         #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace
         view_name = self.view_name or self.parent.opts.view_name
         #if view_namespace:
         #    view_name = "%(namespace)s:%(view)s" % {
         #        'view':view_name,
         #        'namespace':view_namespace
         #    }
 
         pk = getattr(obj, 'pk')
         
         try:
             url = reverse(view_name, request=request, format=format)
             return  "%(url)s?%(query_kwarg)s=%(query_value)s" % {
                     'url': url,
                     'query_kwarg': self.pk_query_kwarg,
                     'query_value': pk
                     }
         except:
             pass
 
         raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
     elif self.slug_query_kwarg:
         request = self.context.get('request', None)
         format = self.format or self.context.get('format', None)
         #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace
         view_name = self.view_name or self.parent.opts.view_name
         #if view_namespace:
         #    view_name = "%(namespace)s:%(view)s" % {
         #        'view':view_name,
         #        'namespace':view_namespace
         #    }
 
         slug = getattr(obj, self.slug_field, None)
 
         if not slug:
             raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
 
         
         try:
             url = reverse(view_name, request=request, format=format)
             return  "%(url)s?%(query_kwarg)s=%(query_value)s" % {
                     'url': url,
                     'query_kwarg': self.slug_query_kwarg,
                     'query_value': slug
                     }
         except:
             pass
 
         raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
     else:
         request = self.context.get('request', None)
         format = self.format or self.context.get('format', None)
         view_name = self.view_name or self.parent.opts.view_name
         kwargs = {self.pk_url_kwarg: obj.pk}
         try:
             return reverse(view_name, kwargs=kwargs, request=request, format=format)
         except:
             pass
 
         slug = getattr(obj, self.slug_field, None)
 
         if not slug:
             raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name)
 
         kwargs = {self.slug_url_kwarg: slug}
         try:
             return reverse(self.view_name, kwargs=kwargs, request=request, format=format)
         except:
             pass
 
         kwargs = {self.pk_url_kwarg: obj.pk, self.slug_url_kwarg: slug}
         try:
             return reverse(self.view_name, kwargs=kwargs, request=request, format=format)
         except:
             pass
 
         raise ValidationError('Could not resolve URL for field using view name "%s"', view_name)