variable template tag registered one not must library ifequal examples django django-models django-templates django-views

template - inclusion tags django



Reducir las consultas de db en django (2)

Deberá consultar select_related () ( https://docs.djangoproject.com/en/1.3/ref/models/querysets/#select-related ) para resolver el problema de fuga de su consulta. Si sabe de antemano que va a consultar datos sobre modelos relacionados con una clave externa, querrá agregar select_related. Incluso mejor si sabes que solo van a ser un par de llaves extranjeras, puedes agregar solo las que necesites.

Cada vez que vea que django ejecutó una gran cantidad de consultas más de lo que esperaba, select_related es casi siempre la respuesta correcta

Tengo una vista que busca a través de una base de datos de créditos de películas, y convierte y devuelve resultados de ese modo:

# From the following results: Avatar - James Cameron - director Avatar - James Cameron - writer Avatar - James Cameron - editor Avatar - Julie Jones - writer Crash - John Smith - director # ...display in the template as: Avatar - James Cameron (director, writer, editor) Avatar - Julie Jones (writer) Crash - John Smith (director)

Sin embargo, cuando realizo esta conversión e print connection.queries , estoy llegando a la base de datos unas 100 veces. Esto es lo que tengo actualmente:

# in models class VideoCredit(models.Model): video = models.ForeignKey(VideoInfo) # if the credit is a current user, FK to his profile, profile = models.ForeignKey(''UserProfile'', blank=True, null=True) # else, just add his name name = models.CharField(max_length=100, blank=True) # normalize name for easier searching / pulling of name normalized_name = models.CharField(max_length=100) position = models.ForeignKey(Position) timestamp = models.DateTimeField(auto_now_add=True) actor_role = models.CharField(max_length=50, blank=True) class VideoInfo(models.Model): title = models.CharField(max_length=256, blank=True) uploaded_by = models.ForeignKey(''UserProfile'') ...

Posición de clase (modelos.Modelo): posición = modelos.CharField (max_length = 100) ordenando = modelos.IntegerField (max_length = 3)

class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) ...

En mi opinión, estoy compilando una lista de tres tuplas en forma de (name, video, [list_of_positions]) para la visualización de créditos.

credit_set = VideoCredit.objects.filter(***depends on a previous function***) list_of_credit_tuples = [] checklist = [] # I am creating a ''checklist'' to see whether to append the positions # list of create a new tuple entry for credit in credit_set: if credit.profile: # check to see if the credit has an associated profile name = credit.profile else: name = credit.normalized_name if (credit.normalized_name, credit.video) in checklist: list_of_keys = [(name, video) for name, video, positions in list_of_credit_tuples] index = list_of_keys.index((name, credit.video)) list_of_credit_tuples[index][2].append(credit.position) else: list_of_credit_tuples.append((name, credit.video, [credit.position])) checklist.append((credit.normalized_name, credit.video)) ...

Y finalmente, en mi plantilla para mostrar los créditos (nota: si el crédito tiene un perfil, proporcione un enlace al perfil del usuario) -

{% for name, video, positions in list_of_credit_tuples %} <p>{% if name.full_name %} <a href="{% url profile_main user_id=name.id %}">{{name.full_name}}</a> {% else %} {{name}} {% endif %} <a href="{% url videoplayer video_id=video.id %}">{{video}}</a> ({% for position in positions %}{% ifchanged %}{{position}}{% endifchanged %}{% if not forloop.last %}, {% endif %}{% endfor %}) {% endfor %}

¿Por qué y dónde esta vista crea tantas consultas de DB? ¿Cómo y de qué manera podría hacer que esta función de vista sea más eficiente / mejor? Gracias.


Intente agregar este fragmento de Django que devuelve la cantidad de consultas y las consultas a su plantilla:

http://djangosnippets.org/snippets/159/

Esto debería indicarle fácilmente de dónde proviene su fuga.