/ / Використання обчислених полів в адміністраторі - django, django-admin

Використання обчислюваних полів в адмініструванні - django, django-admin

Я намагаюся використовувати поле, обчислене під час виконаннясторінка адміністратора. Це добре працює, але я хотів би дозволити сортування на основі цього поля. Чи можливо це використовуючи Django 1.5 (dev)? Я шукав переплетення, але не можу знайти нічого, що свідчить про це є можливий

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"

Мені б хотілося включити сортування за latest_invitation_sent_on. Чи є якісь методи цього красивого, про які я не знаю?

Відповіді:

2 для відповіді № 1

Ви повинні мати можливість коментувати гостейостанній час запрошення, а потім order_by це (order_by використовує БД для сортування та до тих пір, поки ви можете надати дійсне поле БД, таблицю чи віртуальний, він повинен працювати).

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",]

Якщо вам тільки потрібно latest_invite анотація час від часу має сенс перемістити її в окремий метод або навіть менеджер.

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