10
votes

Pourquoi django admin list_select_s_select_Related ne fonctionne pas dans ce cas?

J'ai un Modeladmin Classe qui inclut un champ de clé étranger dans son list_display . Mais la page de liste d'administration pour ce modèle fait des centaines de questions, une requête par ligne pour obtenir les données de l'autre table au lieu d'une jointure ( select_related () ).

Les DJANGO DOCS < href = "https://docs.djangoproject.com/fr/dev/ref/contrib/admin/#django.contrib.admin.modeladmin.admin.modeladmin.list_select_Related" rel = "Nofollow Noreferrer"> Indique Vous pouvez ajouter list_s_select_related = true en tant qu'attribut à votre modeladmin pour que cela disparaisse, mais cela ne semble pas fonctionner du tout pour moi. Cette question "/a> semble donner un problème similaire, mais sa résolution n'est pas claire et ça ne " t Travailler dans mon cas.

Voici une version de coupe de mon modèle et mon modèle admin: xxx

Toutefois, ajoute que list_selected_related = Vrai n'a rien changé. Je reçois toujours beaucoup de questions comme ceci au lieu d'une jointure SQL:

beaucoup de requêtes, pas une jointure

Des idées Pourquoi l'administrateur de Django semble ignorer mon liste_select_Related et faire n requêtes? J'utilise Python 2.7 et Django 1.3.3.


0 commentaires

3 Réponses :


17
votes

Le problème ici est ce paramètre list_s_select_related = true code> ajoute simplement un BASIC code> SELECT_RONATED () code> sur la requête, mais que cet appel ne suive pas par défaut, suivez les eRegrounds avec null = true code>. Donc, la réponse est de définir le queryset que la Changeelist utilise vous-même et spécifiez le FK à suivre:

class EventAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'device')
    def queryset(self, request):
        return super(EventAdmin, self).queryset(request).select_related('device')


3 commentaires

Merci! Le null = true sur la clé étrangère empêchait définitivement le fichier sélectionné. Je suppose que si j'avais suivi le DOCS Tout en bas, j'aurais vu que:" Notez que, par défaut, SELECT_Related () ne suive pas les clés étrangères qui ont NULL = VRAI "


Par intérêt, savez-vous pourquoi list_s_select_related = true n'est pas la valeur par défaut de l'administrateur Django? Cela semblerait être un défaut beaucoup plus raisonnable. (Je peux voir pourquoi par défaut select_related () ne suive pas les clés étrangères qui ont NULL = True, car cela pourrait être un problème de performance, mais je me demande sur list_s_select_related Dans d'autres cas.)


À Django> = 1.6 La méthode est maintenant nommée get_queryset .



9
votes

depuis Django 1.6 , list_select_related code> Accepte un booléen, une liste ou un tuple avec les noms des champs à inclure dans le select_related () code> appel. Par conséquent, vous pouvez maintenant utiliser:

class EventAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'device')
    list_select_related = ['device']


1 commentaires

+1 tandis que la réponse de Daniel Roseman offre une bonne idée de la manière dont les choses fonctionnent. Cette réponse est la version plus simple / mise à jour.



0
votes

Bien que SELECT_RONATED est généralement le moyen d'aller, il y a du temps quand on nécessite plus de contrôle, puis sur la base du get_queryset devient plus applicable, il s'agit d'une version plus moderne de Réponse de Daniel Roseman:

foo et bar sont des champs de clé étrangère: xxx


0 commentaires