You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于用户最后关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:44:56