Django __unicode__ y FK es muy lento

si escribo algo asi

class Chip(models.Model): name = models.CharField(max_length=16) shortname = models.CharField(primary_key=True, unique=True, max_length = 16) def __unicode__(self): return self.shortname class ChipStepping(models.Model): stepping = models.CharField (max_length=16) ChipShortname = models.ForeignKey('Chip', db_column="ChipShortname") def __unicode__(self): return "%s:%s" % (self.ChipShortname, self.stepping) class ComponentType(models.Model): name = models.CharField (max_length=32) ChipStepping = models.ForeignKey('ChipStepping', db_column="ChipStepping") def __unicode__(self): return "%s(%s)" % (self.name, self.ChipStepping); class ComponentVendor(models.Model): name = models.CharField (unique=True, max_length=16) products = models.ManyToManyField('ComponentType', through='ComponentVendorProduct', related_name='vendors') def __unicode__(self): return "%s" % (self.name) class ComponentVendorProduct(models.Model): ComponentVendor = models.ForeignKey('ComponentVendor', db_column="ComponentVendor") ComponentType = models.ForeignKey('ComponentType' , db_column="ComponentType") 

Y trata de crear una página de administración para ComponentVendor

 class ProductInline(admin.TabularInline): model = ComponentVendor.products.through extra = 0 class ComponentVendorAdmin(admin.ModelAdmin): inlines = [ProductInline] list_filter = ['products__name'] exclude = ['products'] admin.site.register(ComponentVendor, ComponentVendorAdmin) 

La página resultante puede tardar más de 30 segundos. Para cargar Desde una depuración que he hecho, descubrí que repetidamente hace consultas singulares redundantes para ChipStepping y luego Chip, con el mismo argumento en la cláusula where en lugar de construir inteligentemente una consulta que pueda buscar todos los datos.

Este problema se reduce si elimino las referencias de clave externa de las funciones Unicode de ChipStepping y ComponentType

Si hay suficientes entradas en ComponentVendorProducts para un proveedor en el que hago clic en la página de administración, ¡la página puede demorar varios minutos!

¿Hay alguna manera de reducir la cantidad de visitas a la base de datos en la página de administración?

Su problema proviene del hecho de que Django realiza una llamada a la base de datos cada vez que llama a __unicode__ en una instancia de ComponentType .

Tienes dos soluciones a tu problema:

  1. Usted anula el método queryset su ProductInline para incluir select_related('ChipStepping') con select_related('ChipStepping') (Django 1.3 y superior).
  2. De forma alternativa, si también quiere solucionar el problema en otro lugar, puede cambiar el método get_query_set administrador de ComponentType ( objects ) get_query_set para que incluya la llamada relacionada con select_related .

es posible que también desee consultar la sugerencia que se ofrece aquí: http://blog.ionelmc.ro/2012/01/19/tweaks-for-making-django-admin-faster/

Parece que las opciones se evalúan para cada fila, por lo que al usar formfield_for_dbfield puede almacenar en caché las opciones como se sugiere en el enlace. Esto ahorra ir a la base de datos para representar cada uno de los cuadros desplegables / selectos para foreign_keys