2012-04-15 65 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