使用F和Q操作进行Django过滤

时间:2018-06-27 16:51:02

标签: django

我的Django项目中有一个模型类:

*user_id
*amount
*net_balance
*created_on

我有一个user_ids列表(比方说3)。我需要为每个user_id获取最后一行,然后执行一些操作并为每个用户ID创建一个新行。如何有效地做到这一点。我当然可以进行6笔交易(如果用户ID列表中有3笔交易)。

2 个答案:

答案 0 :(得分:0)

如果您想要最新的条目,

ValueError: Can only compare identically-labeled Series objects

如果我正确理解了您的问题,那么您需要获取所有user_id(大概有一个单独的User模型?),然后遍历它们-为每个用户获取最新条目,然后创建新行。

答案 1 :(得分:0)

您需要(至少)对所有感兴趣的记录进行选择(至少),并对每个返回的记录进行1次插入查询。 选择查询可以由ORM功能(聚合)生成,或者,如果您愿意的话,可以使用原始SQL。如果您使用PostgreSQL,则可以将与众不同功能(我推荐)用作:

Model.objects.order_by('user_id', '-created_on').distinct('user_id')

或者您可以将聚合功能用作:

Model.objects.filter(user_id__in=[1,2,3]).values('user_id', 'created_on').annotate(last_row=Max('created_on')).filter(created_on=F('last_row'))

正确答案取决于您的Django版本和数据库。但是Django中有很多不错的功能可以实现这种功能。