# admin.py
class CustomerAdmin(admin.ModelAdmin):
list_display = ('foo', 'number_of_orders')
# models.py
class Order(models.Model):
bar = models.CharField[...]
customer = models.ForeignKey(Customer)
class Customer(models.Model):
foo = models.CharField[...]
def number_of_orders(self):
return u'%s' % Order.objects.filter(customer=self).count()
Comment pourrais-je trier les clients, selon number_of_orders
qu'ils ont?
admin_order_field
La propriété ne peut pas être utilisée ici, car elle nécessite un champ de base de données pour effectuer le tri. Est-ce possible du tout, car Django s'appuie sur la base de données sous-jacente pour effectuer le tri? Créer un champ agrégé pour contenir le nombre de commandes semble ici exagéré.
La chose amusante: si vous changez l'url à la main dans le navigateur pour trier cette colonne - cela fonctionne comme prévu!
django
sorting
django-admin
mike_k
la source
la source
Réponses:
J'ai adoré la solution de Greg à ce problème, mais j'aimerais souligner que vous pouvez faire la même chose directement dans l'administrateur:
De cette façon, vous n'annotez que dans l'interface d'administration. Pas avec chaque requête que vous faites.
la source
def number_of_orders(self, obj): return obj.order__count
get_queryset()
placequeryset()
?Je n'ai pas testé cela (je serais intéressé de savoir si cela fonctionne) mais qu'en est-il de la définition d'un gestionnaire personnalisé pour
Customer
lequel inclut le nombre de commandes agrégées, puis de la définitionadmin_order_field
de cet agrégat, c'est-à-direEDIT: Je viens de tester cette idée et cela fonctionne parfaitement - aucune sous-classification d'administrateur de Django n'est requise!
la source
La seule façon dont je peux penser est de dénormaliser le champ. Autrement dit, créez un champ réel qui est mis à jour pour rester synchronisé avec les champs dont il est dérivé. Je fais généralement cela en remplaçant save sur le modèle avec les champs dénormalisés ou le modèle dont il dérive:
la source