/ / Utilizzo dei campi calcolati in admin - django, django-admin

Utilizzo dei campi calcolati in admin - django, django-admin

Sto cercando di utilizzare un campo calcolato dal runtime nel miopagina di amministrazione. Funziona bene, ma mi piacerebbe consentire l'ordinamento basato per quel campo.Utilizzando Django 1.5 (dev), è possibile? Ho setacciato l'interweb ma non riesco a trovare nulla che lo indichi è possibile.

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"

Mi piacerebbe essere in grado di abilitare l'ordinamento da latest_invitation_sent_on. Ci sono dei metodi per farlo bene che non sono a conoscenza?

risposte:

2 per risposta № 1

Dovresti essere in grado di annotare gli Ospiti con i lorol'ultimo orario di invito e quindi order_by it (order_by utilizza il DB per ordinare e finché è possibile fornire un campo DB valido, tabella o virtuale dovrebbe funzionare).

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 hai solo bisogno latest_invite annotazione di tanto in tanto ha senso spostarlo in un metodo separato o addirittura manager.

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()