为了账号安全,请及时绑定邮箱和手机立即绑定

什么是在Django中使用的`related_name`?

什么是在Django中使用的`related_name`?

桃花长相依 2019-07-23 17:51:58
什么是在Django中使用的`related_name`?什么是related_name对on ManyToManyField和ForeignKey字段有用的参数?例如,给出以下代码,有什么影响related_name='maps'?class Map(db.Model):     members = models.ManyToManyField(User, related_name='maps',                                      verbose_name=_('members'))
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

related_name属性指定从User模型返回到模型的反向关系的名称。

如果不指定related_name,Django会自动使用一个带有后缀的型号的名称创建_set,例如User.map_set.all()

如果指定,例如related_name=mapsUser模型中,User.map_set仍然可以工作,但User.maps.语法显然有点清洁,少笨重; 例如,如果您有一个用户对象current_user,则可以使用该模型current_user.maps.all()获取与之Map关系的所有模型实例current_user

Django文档有更多的细节。


查看完整回答
反对 回复 2019-07-23
?
手掌心

TA贡献1942条经验 获得超3个赞

要添加到现有答案相关名称是必须的,以防模型中有2个FK指向同一个表。例如,在物料清单的情况下

@with_author class BOM(models.Model): 
    name = models.CharField(max_length=200,null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    tomaterial =  models.ForeignKey(Material, related_name = 'tomaterial')
    frommaterial =  models.ForeignKey(Material, related_name = 'frommaterial')
    creation_time = models.DateTimeField(auto_now_add=True, blank=True)
    quantity = models.DecimalField(max_digits=19, decimal_places=10)

因此,当您必须访问此数据时,您只能使用相关名称

 bom = material.tomaterial.all().order_by('-creation_time')

它没有其他工作(至少我无法跳过相同名称的使用,如果2 FK到同一个表。)


查看完整回答
反对 回复 2019-07-23
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

related_name如果您有更复杂的相关类名,则该参数也很有用。例如,如果您有外键关系:

class UserMapDataFrame(models.Model):
    user = models.ForeignKey(User)

为了UserMapDataFrame从相关对象访问对象User,默认调用将User.usermapdataframe_set.all()是非常难以阅读的。

使用related_name允许您指定更简单或更易读的名称以获得反向关系。在这种情况下,如果您指定user = models.ForeignKey(User, related_name='map_data'),则调用将是User.map_data.all()


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 1955 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信