# 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()
Como eu poderia classificar os clientes, dependendo number_of_orders
deles?
admin_order_field
A propriedade não pode ser usada aqui, pois requer um campo de banco de dados para classificação. É possível, já que o Django depende do banco de dados subjacente para realizar a classificação? Criar um campo agregado para conter o número de pedidos parece um exagero aqui.
O mais divertido: se você alterar o URL manualmente no navegador para classificar nesta coluna - ele funcionará conforme o esperado!
django
sorting
django-admin
mike_k
fonte
fonte
Respostas:
Adorei a solução de Greg para esse problema, mas gostaria de salientar que você pode fazer a mesma coisa diretamente no administrador:
Dessa forma, você apenas faz anotações dentro da interface de administração. Não com todas as consultas que você faz.
fonte
def number_of_orders(self, obj): return obj.order__count
get_queryset()
vez dequeryset()
?Eu não testei isso (eu estaria interessado em saber se funciona), mas que tal definir um gerente personalizado para o
Customer
qual inclua o número de pedidos agregados e depois definiradmin_order_field
esse agregado, ou seja,EDIT: Acabei de testar essa idéia e ela funciona perfeitamente - não é necessária nenhuma subclasse de administrador do django!
fonte
A única maneira de pensar é desnormalizar o campo. Ou seja - crie um campo real que seja atualizado para permanecer sincronizado com os campos dos quais é derivado. Eu costumo fazer isso substituindo save on eith o modelo pelos campos desnormalizados ou o modelo do qual deriva:
fonte