我正在尝试在管理页面中使用运行时计算字段。这很好,但我想允许基于该字段的排序。使用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
启用排序。是否有任何方法可以很好地完成这项我不知道的事情?
答案 0 :(得分:2)
您应该能够使用他们的最新邀请时间注释来宾,然后按顺序对其进行注释(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()