Django多对多字段related_name疑问:favorite_things与favs_users是否返回相同对象
二者获取到的对象完全不同,具体区别如下:
user.favorite_things是Thing模型中多对多字段favorites的反向查询结果,返回的是当前用户收藏的所有Thing模型实例的QuerySet,可以直接拿到所有收藏的内容对象。user.favs_users是中间表Fav模型中外键字段user的反向查询结果,返回的是当前用户对应的所有Fav中间表实例的QuerySet,每个Fav实例仅记录用户和Thing的收藏关联关系,要拿到对应的Thing内容还需要通过fav.thing做跨表查询。
你可以参考下面的代码示例理解二者的差异:
# 方式1:通过favorite_things直接获取收藏的Thing标题 titles1 = [thing.title for thing in user.favorite_things.all()] # 方式2:通过favs_users先拿到中间表实例,再跨表获取Thing标题 titles2 = [fav.thing.title for fav in user.favs_users.all()] # 两种方式最终得到的标题列表内容一致,但中间操作的对象类型完全不同
额外补充:你之前提到的user.fav_thing_owner是Thing模型中owner外键字段的反向查询结果,返回的是当前用户作为所有者创建的所有Thing实例的QuerySet,和上述两个查询的业务含义也完全区分,一个对应自己创建的内容,一个对应自己收藏的内容。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

