2016-11-22 8 views
1

私はDjango 1.10を使用しています。関連モデルの__maxルックアップを使用したクエリーセットの注釈

class Product(models.Model): 
    name = models.CharField(max_length=255) 
    ... 


class TransitionLog(models.Model): 
    TransitionStates =[ 
     ('state_one', _('State One')), 
     ('state_two', _('State Two')), 
     ('state_three', _('State Three')) 
    ] 
    product = models.ForeignKey(Product) 
    transitioned_to = models.CharField(choices=TransitionStates, null=False, blank=False) 
    transitioned_timestamp = models.DateTimeField(auto_now_add=True) 

そして、何私がやりたいことはTransitionLogtransitioned_to分野で最新の遷移状態、とProductクエリセットに注釈を付けるです:

は、私は次のようになりますモデルのカップルを持っています。最新の状態は、最新のtransitioned_timestampの状態になります。

私は次の操作を行って、そこに道のほとんどを得ている:

Product.objects.annotate(latest_transition=Case(When(transitionlog__pk=Max('transitionlog__pk'), then='transitionlog__transitioned_to'))) 

私の懸念は、私の目的のために働くことになる、Max()が唯一のPKを見て、最高のものを取ることがあるがしかし、私がやりたいことは、最新のtransitioned_timestampを入手することです。

問題は最新のタイムスタンプを見つけた後にTransitionLog.pkでマッチを行う方法がわかりません。私は、ログを別々に取得してそこからジョインすることで、2つのクエリでこれを行うこともできることを知っていますが、私もそれを避けたいと思います。

誰でも、最新のタイムスタンプ遷移ログを特定のProductの1つのクエリで取得できる方法を提案できますか?どんな助けもありがとう。ありがとう!

答えて

1

私が考えることができる最も良い方法は、各製品の最新のトランジションを取得することです。それから、あなたの製品は移行によってそれらにアクセスします。

transitions = TransitionLog.objects.all().order_by('-transitioned_timestamp').distinct('product_id') 

ただし、問題が1つあります。関連するTrasitionLogオブジェクトを持たない製品はありません。

関連する問題