Nothing in Django specifically that I'm aware of (although that's not
saying much), but you can probably do something pretty slick with the
operator library and attrgetter:

https://docs.python.org/2/library/operator.html#operator.attrgetter

It would probably look something like this (untested):


# define a function to pull the nested attribute
# assume this is in myapp/utils.py
def get_item_attr(obj_instance, search_string):
    dotted_string = search_string.replace('__', '.')
    instance_attr = operator.attrgetter(dotted_string)
    instance_attr_value = instance_attr(obj_instance)
    return item_attr_value


# later, in a view, maybe...
from myapp.utils import get_item_attr
booking_client_name = get_item_attr(trip, 'booking__client__name')


Obviously this is naive and you'll need to check for failures at various
points and raise some exceptions if attributes can't be found/accessed, but
I think this may point you in the right direction.

Never tried this on my own so YMMV. Note that you'll incur multiple DB hits
using a function like this (for the FK traversals), so be careful if you
plan to run such a function several times for a single request.

-James


On Mon, Mar 2, 2015 at 10:54 AM, Francis Devereux <[email protected]> wrote:

> Hi,
>
> Is there a Django function that takes a model instance and a lookup
> string, and returns the value of the related field?
>
> For example:
>
>     the_function_i_am_looking_for(trip, 'booking__client__name')
>
> would return the same as:
>
>     trip.booking.client.name
>
> Thanks,
>
> Francis
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/FB0F25B1-00B0-4CD5-A62D-B9CE44F189C8%40devrx.org
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CA%2Be%2BciWP%2BZ9A_D%3DCxrPfgoUVZEtN3FLWe_eQSmpwN7eD9sJrFw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to