2011-11-16 22 views
6

Si estoy recuperación de un objeto con Django, puedo usar .select_related() para instruir a Django para conseguir todos los objetos de clave externa, así, a saber:django: select_related() en un objeto ya existente?

obj = ModelClass.objects.select_related().get(id=4) #1 db hit 
foo = obj.long.chain.of.stuff #no db hit 

Si ya tengo obj, sin que haya sido .select_related(), que es:

def doit(obj): 
    obj.long.chain.of.stuff #4 db hits 

¿hay alguna forma de que django complete todas sus relaciones con la clave externa? Algo así como:

def doit(obj): 
    obj.magic() #1 db hit 
    obj.long.chain.of.stuff #no db hits 

Respuesta

3

supongo que puedo hacer:

def doit(obj): 
    obj = obj.__class__.objects.select_related().get(id=obj.id) #1 db hit 
    obj.long.chain.of.stuff #no db hits 

Pero ¿hay alguna manera más agradable?

+2

Creo que esa será tu única manera. Sin embargo, me aseguraría de comentar ese código, por lo que cualquiera que lo mire más tarde no se rascará la cabeza preguntándose por qué lo hizo, o peor, lo eliminará porque parece redundante. –

Cuestiones relacionadas