/ / Usando campos computados em admin - django, django-admin

Usando campos computados em admin - django, django-admin

Estou tentando usar um campo calculado em tempo de execução no meupágina de administração. Isso funciona bem, mas eu gostaria de permitir a classificação com base nesse campo. Usando Django 1.5 (dev), isso é possível? Estive pesquisando a internet, mas não consigo encontrar nada que indique que é possível.

class Guest(models.Model)
email = models.CharField(max_length=255)

class Invitation(models.Model)
guest = models.ForeignKey(Guest)
created_on = models.DateTimeField(auto_now_add=True)

class GuestAdmin(admin.ModelAdmin):
list_display = ["email", "latest_invitation_sent_on",]

def latest_invitation_sent_on(self, o):
try:
return o.invitation_set.all().order_by(
"-created_on")[0].created_on.strftime("%B %d, %Y")
except IndexError:
return "N/A"

Eu gostaria de poder habilitar a classificação por latest_invitation_sent_on. Existe algum método de fazer isso bem que eu não conheça?

Respostas:

2 para resposta № 1

Você deve ser capaz de anotar convidados com seusúltima hora do convite e, em seguida, order_by ele (order_by usa o banco de dados para classificar e, contanto que você possa fornecer um campo de banco de dados válido, tabela ou virtual, ele deve funcionar).

class GuestManager(models.Manager):
def get_query_set(self):
return super(GuestManager, self).get_query_set().annotate(latest_invite=Max("invitation_set__created_on"))

class Guest(models.Model)
email = models.CharField(max_length=255)
objects = GuestManager()

class Invitation(models.Model)
guest = models.ForeignKey(Guest)
created_on = models.DateTimeField(auto_now_add=True)

class GuestAdmin(admin.ModelAdmin):
list_display = ["email", "latest_invite",]

Se você só precisa latest_invite anotação de vez em quando, faz sentido movê-la para um método ou gerenciador separado.

class GuestManager(models.Manager):
def by_invitations(self):
return super(GuestManager, self).get_query_set().annotate(latest_invite=Max("invitation_set__created_on")).order_by("-latest_invite")

>>>  Guest.objects.by_invitations()