如何通过Join关联模型查询Django中用户已加入的Room列表
实现方案
方式1:不用修改现有模型直接查询
Django默认会使用小写模型名作为外键反向查询的名称,针对你现有的模型,假设已拿到指定用户实例target_user,查询语句如下:
joined_rooms = Room.objects.filter(join__user=target_user)
方式2:添加related_name优化查询语义
你可以给外键字段添加related_name属性自定义反向引用的名称,避免默认命名的混淆,修改Join模型如下:
class Join(models.Model): room = models.ForeignKey(Room, on_delete=models.CASCADE, related_name="user_join_records") user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="room_join_records")
修改后查询语句可以写成更易读的形式:
joined_rooms = Room.objects.filter(user_join_records__user=target_user)
方式3:配置多对多字段简化查询
你的场景本质是用户和房间的多对多关联,Join是多对多的中间表,你可以直接在Room模型中声明多对多关联,后续查询会更方便:
class Room(models.Model): room_name = models.CharField(max_length=40) create_by = models.ForeignKey(User, on_delete=models.CASCADE) # 新增多对多字段,指定through为中间表Join members = models.ManyToManyField(User, through="Join", related_name="joined_rooms")
配置完成后,获取指定用户加入的房间只需要一行代码:
joined_rooms = target_user.joined_rooms.all()
related_name和related_query_name区别
- related_name:用于从关联模型反向获取实例列表时的属性名,比如上面
user.joined_rooms里的joined_rooms就是related_name的取值 - related_query_name:用于ORM过滤查询时的字段前缀,如果你没有单独配置,默认和
related_name的取值一致,不需要额外设置
相关搜索关键词
Django 反向外键查询、Django related_name 用法、Django 多对多中间表查询、Django related_query_name 区别
内容的提问来源于stack exchange,提问作者HaloNewWorld
相关产品推荐
相关产品推荐

