2

我正在尝试在我的管理页面中使用运行时计算的字段。这很好用,但我想允许基于该字段进行排序。使用 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。有什么我不知道的方法可以很好地做到这一点吗?

4

1 回答 1

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()
于 2012-04-15T12:02:33.097 回答