次のようなテーブルがあります。
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)