2011-11-16 18 views
6

Jeśli jestem pobierania obiektu z Django, mogę używać .select_related() pouczać Django, aby uzyskać wszystkie kluczy obcych obiektów, jak również, a mianowicie:django: select_related() na już istniejącym obiekcie?

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

Jeśli mam już obj, bez niego będąc .select_related(), że jest:

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

jest jakiś sposób, aby uzyskać Django do wypełnienia wszystkich kluczowych relacji zagranicznych? Coś jak:

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

Odpowiedz

3

Przypuszczam mogę zrobić:

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

Ale jest jakiś ładniejszy sposób?

+2

Myślę, że to będzie twój jedyny sposób. Zrobiłbym jednak pewien komentarz do tego fragmentu kodu, więc każdy, kto się nim zajmie, nie będzie drapał się w głowę, zastanawiając się, dlaczego tak się stało, albo gorzej, usuń go, ponieważ wygląda na zbędny. –

Powiązane problemy