Django:如何查询OneToOne关联的Card的card_written为False的User对象?
跨表筛选一对一关联的User对象
基于给出的模型定义,可以直接通过Django ORM的跨表查询语法实现需求,无需额外手动连表。
核心查询逻辑
Card.user是指向User的一对一外键,且没有自定义反向关联名,按照Django的默认规则,一对一关联的反向访问字段无需加_set后缀,默认是关联模型的小写类名(即这里的card),直接用双下划线跨表筛字段即可:
# 获取所有关联Card记录、且对应card_written为False的User查询集 target_users = User.objects.filter(card__card_written=False)
查询优化建议
如果后续在视图中需要读取关联Card的字段,可搭配select_related做联表预加载,避免后续遍历查询集时触发额外的重复SQL查询:
# 联表预加载关联Card数据,减少数据库交互次数 target_users = User.objects.select_related("card").filter(card__card_written=False)
常见踩坑提示
- 上述查询默认走内连接逻辑,会自动排除没有对应Card记录的User对象,刚好匹配“关联Card模型的card_written为False”的筛选条件,不需要额外加
card__isnull=False的判断 - 如果后续修改
Card.user字段,添加了自定义的related_name参数(比如设置related_name="member_card"),查询时需要把跨表字段名替换为自定义的关联名,对应查询语句为User.objects.filter(member_card__card_written=False) - 不要混用普通外键的反向查询规则:普通多对一外键的反向访问默认带
_set后缀,一对一关联无此后缀,强行写card_set作为跨表字段会抛出字段不存在的报错
内容的提问来源于stack exchange,提问作者Pranjal
相关产品推荐
相关产品推荐

