Django prefetch when listing objects in admin

I have the following models:

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)

The problem is now in the Ticket admin interface. The userinfo field of the user is displayed as a drop-down menu. If the database has many UserInfo, each of them makes one database call (UserProfile) to generate its own name.

How can I tell the admin (or any widget) about prefetching the associated UserProfiles when it displays the UserInfo drop-down menu?

I'm looking for something like

info = models.OneToOneField(UserInfo, related_name='user', prefetch_in_bulk=True)
+5
source share
1 answer

I figured out one way to do this:

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)

Now the necessary models are pre-selected as a single sql query, rather than many queries.

+8
source

All Articles