1

次のようなテーブルがあります。

ID    | Time Stamp
1     | 2012-07-28 18:57:48.160912+01 
1     | 2012-07-28 20:57:43.063327+01
2     | 2012-07-28 21:17:16.016665+01

各IDの最新エントリーを見たいです。

これを行うと、最新のエントリを持つオブジェクトが 1 つだけ取得されます。

open_deals = all_deals.latest('time_stamp'))

-->     2    | 2012-07-28 21:17:16.016665+01

しかし、私は取得したいです

-->    1     | 2012-07-28 20:57:43.063327+01
       2     | 2012-07-28 21:17:16.016665+01

IDを集約またはグループ化する必要があります。しかし、ドキュメントにはそのための機能はありません。

任意のヒント?ありがとうございました

アップデート:

以下の解決策を試しました:

result_list = [deal.dealchangelog_set.latest('time_stamp') for deal in open_deals]
        result_set = set()
        for item in result_list:
            result_set.add(item.pk)
        return open_deals.filter(pk__in = result_set)

ここに画像の説明を入力

残念ながら、ご覧のとおり、リストには 2 つではなく 3 つのオブジェクトがまだ含まれています。:-(

これが私のモデルです (deal_id を pk として使用していないことに注意してください)。pk はまだ整数です。私の場合、一意ではない最新の deal_id を取得する必要があります。(簡単にするために、ここでは uuid を整数として以前に示しました)

class Deal(models.Model):
    deal_id             = UUIDField()
    status              = models.ForeignKey(DealStatus, verbose_name=_(u"Deal Status"), null=True, blank=True)    
    contact             = models.ForeignKey(Contact)
    deal_type           = models.ForeignKey(DealType)    

class DealChangeLog(models.Model):
    deal                = models.ForeignKey(Deal)
    time_stamp          = CreationDateTimeField()

更新 2:

def get_open_deals(call):
        all_deals = Deal.objects.filter(contact=call.contact)            
        closed_deals = all_deals.filter(status__in=[5, 6])
        closed_deal_list = []
        if closed_deals:
            for item in closed_deals:
                closed_deal_list.append(item.deal_id)
        open_deals = all_deals.exclude(deal_id__in=closed_deal_list)        
        result_list = [deal.dealchangelog_set.latest('time_stamp') for deal in open_deals]
        result_set = set()
        for item in result_list:
            result_set.add(item.pk)
        return open_deals.filter(pk__in = result_set)
4

1 に答える 1

0

私はコンテキストを認識していませんが、おそらく次のようにモデルを分割します。

class Deal(models.Model):
    title = models.CharField()
    # maybe signal changes etcetera... 

class DealChangeLog(models.Model):
    deal = models.ForeignKey(Deal)
    date = models.DateTimeField(auto_now=True, auto_now_add=True)

次に、リスト内包表記によって結果を達成できます。

results = [deal.dealchangelog_set.latest('date') for deal in Deal.objects.all()]

結果をクエリセットとして取得するには、次のようにします。

Deal.objects.filter(id__in=[result.deal.id for result in results])

しかし、結果をリストとして処理できるのであれば、追加のクエリにはあまり意味がありません。

于 2012-07-28T21:51:50.323 に答える