Alors, disons que j'ai des modèles comme celui-ci: alors c'est le modèleAdmin: p> Ça jette une erreur quand je Allez sur le site d'administration indiquant que "DernierCommerment" n'a pas été trouvé dans App.foo. L'avoir dans list_display fonctionne bien. Donc, ma question est la suivante: existe-t-il un moyen de commander des modèles dans List_Display par des méthodes du modèle? Et si oui, comment? P> p>
3 Réponses :
Commander est une fonctionnalité de niveau SQL et votre base de données ne sait rien sur les méthodes de votre modèle. P>
Cependant, vous pouvez ré-trier après le fait en convertissant votre queryset sur une liste, puis en utilisant quelque chose comme Pour ce que ça vaut la peine, je doute que la liste triée fonctionnera dans l'administrateur. Je pourrais avoir tort, mais je suis à peu près sûr que Django a besoin de rester un query. P> trié code>. Voir: http://wiki.python.org/moin/howto/sort/ p>
Cela ne résout pas le problème. get_ordering code> ne vous permet que de spécifier de manière dynamique la commande; Vous toujours i> doit utiliser les champs de base de données réels, pas une méthode sur le modèle.
Bonne remarque, en effet, cela ne vous permet pas de personnaliser la commande.
Je n'ai pas testé le code, mais simplement comme une idée d'essayer de mettre en oeuvre cela avec le requérant de la méthodeDmin avec une fonction d'annotation pour trier sur un champ à partir de champ associé:
class FooAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(FooAdmin, self).queryset(request)
return qs.distinct() \
.annotate(date_of_last_comment=Max('comment__date')) \
.order_by('-date_of_last_comment')
Cela fonctionne bien, juste un problème. Il n'ya aucun moyen de revenir à cette commande une fois que cela a été changé (à un nom, s'il y avait un champ pour cela). Mais merci, cela devrait faire au moins un moment.