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 は DB を使用してソートし、有効な DB フィールド、テーブル、または仮想を提供できる限り機能するはずです)。

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 に答える