如何在Django查询中两次使用filter 解决QuerySet匹配报错问题
报错根因
你在代码中直接将Participants.objects.filter()返回的**查询集(QuerySet,多条记录的集合)**作为=精确匹配的参数传给外键字段participants_name,Django要求外键精确匹配只能传入单个模型实例或主键值,因此触发该报错。
符合两次filter调用要求的正确写法
你可以用链式调用两次filter完成过滤,有两种常用实现方式:
方式1:跨表关联+链式filter
利用Django ORM的双下划线跨关联查询语法,直接链式调用两次filter完成多条件过滤:
# 写法1:拆分条件到两次filter调用中 get_members = PaymentDetails.objects.filter( # 第一次filter:匹配当前用户关联的参与者记录 participants_name__participants_name__user=request.user ).filter( # 第二次filter:添加额外过滤条件,示例为匹配已支付的记录 participants_paid_status=True )
方式2:先过滤参与者再匹配支付记录
如果你需要提前单独过滤参与者查询集,再用该查询集过滤支付记录,改用__in语法匹配多个值即可:
# 先过滤出当前用户关联的所有参与者记录 target_participants = Participants.objects.filter(participants_name__user=request.user) # 两次调用filter完成支付记录过滤 get_members = PaymentDetails.objects.filter( participants_name__in=target_participants ).filter( participants_paid_status=True )
补充说明
如果你的业务逻辑中Profile和Participants是一对一的关系,一个用户只会对应一条参与者记录,也可以将filter改为get获取单个实例,直接用=匹配外键即可。
内容的提问来源于stack exchange,提问作者faiz khan
相关产品推荐
相关产品推荐

