如何基于用户最后关联Package的Platform Slug查询用户?
解决方案
要实现基于用户最后一个关联的Package所属Platform的slug筛选用户,你需要先定位到每个用户最新的UserToPackageMeta记录,再关联对应的Platform进行筛选。以下是具体实现方式:
前提说明
默认假设UserToPackageMeta的id字段自增(Django模型默认行为),因此id最大的记录即为用户最后关联的Package。如果你的模型中有专门的时间字段(比如created_at = models.DateTimeField(auto_now_add=True)),建议将排序字段换成-created_at,时间顺序判断会更准确。
代码实现
from django.db.models import Subquery, OuterRef, F # 子查询:获取每个用户最后一条UserToPackageMeta的id latest_package_meta_subquery = UserToPackageMeta.objects.filter( user=OuterRef('pk') ).order_by('-id').values('id')[:1] # 筛选出最后关联的Package所属Platform符合目标slug的用户 target_slug = "你的目标slug" users = User.objects.annotate( latest_package_meta_id=Subquery(latest_package_meta_subquery) ).filter( package_metas__id=F('latest_package_meta_id'), package_metas__package__platform__slug=target_slug )
简化写法
也可以直接在filter中嵌套子查询,省略annotate步骤:
users = User.objects.filter( package_metas__in=UserToPackageMeta.objects.filter( user=OuterRef('pk') ).order_by('-id')[:1], package_metas__package__platform__slug=target_slug )
原查询问题分析
你之前的users.filter(package_metas__package__platform=platform)会匹配用户所有关联的PackageMeta,只要其中任意一个关联的Package属于目标Platform,就会返回该用户,完全没有考虑是否是最后一个关联的记录,因此无法满足需求。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

