2013-03-22 12 views
5

Ho seguenti modelli:django prefetch quando si elencano gli oggetti in admin

class UserProfile(models.Model): 
    name = models.CharField() 
    info = models.OneToOneField(UserInfo, related_name='user') 

class UserInfo(models.Model): 
    def __unicode__(self): 
    return self.user.__unicode__() + self.age 
    age = models.IntegerField() 

class Ticket(models.Model): 
    userinfo = models.ForeignKey(UserInfo) 

Il problema è ora nell'interfaccia di biglietteria di amministrazione. Il campo userinfo del ticket viene visualizzato come menu a discesa. Se c'è un sacco di UserInfo nel database, ognuno di essi effettua una singola chiamata al database (UserProfile) per generarne il nome.

Come posso dire all'amministratore (oa qualsiasi widget) di eseguire il precaricamento dei profili utente correlati durante il rendering del menu a discesa UserInfo?

Sto cercando qualcosa di simile

info = models.OneToOneField(UserInfo, related_name='user', prefetch_in_bulk=True) 
+0

usa 'return unicode (" {} + {} ". Format (self.user, self.age))' invece di quello che hai ora ('__unicode__' dovrebbe restituire unicode, non stringhe). –

risposta

8

ho capito un modo per farlo:

class TicketAdminForm(forms.ModelForm): 
    class Meta: 
    model = Ticket 
    userinfo = forms.ModelChoiceField(queryset=UserInfo.objects.prefetch_related('user').all()) 

class TicketAdmin(admin.ModelAdmin): 
    form = TicketAdminForm 

admin.site.register(Ticket, TicketAdmin) 

Ora i modelli necessari sono precaricate come una query SQL uno piuttosto che molte query.

+5

Questo dovrebbe essere veramente parte di Django di default. Dovrebbe avere abbastanza informazioni per essere in grado di fare una tale ottimizzazione. –