2013-03-22 15 views
5

mam następujące modele:Django preselekcji podczas dodawania obiektów 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) 

Problem jest teraz w interfejsie administratora biletów. Pole informacji o polu Ticket jest wyświetlane jako rozwijane. Jeśli w bazie danych znajduje się wiele UserInfo, każdy z nich wykonuje pojedyncze wywołanie do bazy danych (UserProfile) w celu wygenerowania swojej nazwy.

Jak mogę powiedzieć administratorowi (lub dowolnemu widgetowi), aby wstępnie pobrać powiązane profile użytkownika podczas renderowania listy rozwijanej UserInfo?

szukam czegoś jak

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

użyj 'return unicode (" {} + {} ".format (self.user, self.age))' zamiast tego, co masz teraz ('__unicode__' powinien zwrócić unicode, a nie ciągi znaków). –

Odpowiedz

8

zorientowali się jeden sposób, aby to zrobić:

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) 

Teraz potrzebne modele są wstępnie pobrać jako jeden zapytania sql zamiast wielu zapytań.

+5

To powinno być domyślnie częścią Django. Powinien mieć wystarczającą ilość informacji, aby móc przeprowadzić taką optymalizację. –