2012-04-15 5 views
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で並べ替えを有効にすることができるようにしたいと思います。これをうまくやって私が気付いていない方法はありますか?

答えて

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() 
+0

私が得る、コードのあなたの最初のチャンクを使用して 'GuestAdmin.list_displayは、[4]、「latest_invite」呼び出し可能か「GuestAdmin」の属性やモデル「Guest'.'では見られません。これは、adminクラスの 'queryset'メソッドで' print o.latest_invite'をスティックするとうまく印刷されるので、奇妙です。なぜなら何らかの理由で 'list_display'が失敗しているからです。 –

+0

@DemianBrechtマネージャを使うのではなく、' created_on'を返すクラスに別のインスタンスメソッドを追加するだけです – agf

+0

Django 1.6以来、 'get_query_set 'メソッドの名前が' get_queryset'に変更されました –

関連する問題