2012-04-15 62 views
2

我试图在我的管理页面中使用运行时计算字段。这工作正常,但我想允许基于该字段排序。使用Django 1.5(dev),这可能吗?我一直在搜索interweb,但无法找到任何指示它的可能。在管理中使用计算字段

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

您应该能够使用他们最新的邀请时间注释来宾,然后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() 
+0

使用你的代码的第一块,我得到'GuestAdmin.list_display [4],“latest_invite”不是一个可调用或“GuestAdmin”的属性或模型“Guest'.'找到。这很奇怪,因为如果我在admin类的queryset方法中插入一个'print o.latest_invite',它会打印正常。由于某种原因,尽管'list_display'失败.. – 2012-04-15 16:45:07

+0

@DemianBrecht而不是使用管理器只是添加另一个实例方法的类,它返回它的'created_on' – agf 2012-04-15 18:58:43

+0

未来的读者注意到:自从Django 1.6,'get_query_set '方法已被重命名为'get_queryset' – 2016-06-16 02:05:50