Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Optimieren Sie die Django-Abfrage, um Fremdschlüssel und Django-Taggit-Beziehungen abzurufen

Es ist möglich, prefetch_related zu verwenden um die Tags abzurufen, aber Sie müssen die Eigenschaft 'tags' umgehen, da dies - wie jdi sagt - eher ein benutzerdefinierter Manager als eine echte Beziehung ist. Stattdessen können Sie Folgendes tun:

actions = Action.objects.select_related('reoccurance').filter(complete=False)\ .prefetch_related('tagged_items__tag')

Leider action.tags.all in Ihrem Vorlagencode wird den Prefetch nicht verwenden und am Ende eine eigene Abfrage durchführen - also müssen Sie auch dort den ziemlich hackigen Schritt unternehmen, den 'Tags'-Manager zu umgehen:

{% for tagged_item in action.tagged_items.all %}
    <span>{{ tagged_item.tag }}</span>{% if not forloop.last %}, {% endif %}
{% endfor %}

(Hrsg.:Wenn Sie "'QuerySet' object has no attribute 'prefetch_related'" erhalten, deutet dies darauf hin, dass Sie eine Version von Django unter 1.4 verwenden, in der prefetch_related nicht verfügbar ist.)