related_name
参数在ManyToManyField
和ForeignKey
字段上有什么用处?例如,鉴于以下代码,related_name = 'maps'
的效果是什么?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
参数在ManyToManyField
和ForeignKey
字段上有什么用处?例如,鉴于以下代码,related_name = 'maps'
的效果是什么?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
属性指定了从 User
模型返回到您的模型的反向关系的名称。related_name
,Django 会自动使用您的模型名称加上后缀 _set
创建一个名字,例如 User.map_set.all()
。User
模型上使用 related_name=maps
,User.map_set
仍然可以工作,但是 User.maps.
的语法更加简洁和清晰;因此,例如,如果您有一个用户对象 current_user
,您可以使用 current_user.maps.all()
获取所有与 current_user
有关系的 Map
模型实例。
Django 文档 中提供了更多详细信息。related_name='maps+'
会发生什么? - Sidddjango1.11>
中指定了related_name
,那么_set
是否仍然有效? - E_K补充现有答案 - 如果模型中有两个指向同一张表的外键,那么相关名称是必须的。例如,在物料清单的情况下。
@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')
否则它将无法工作(至少我无法在两个外键指向同一张表的情况下跳过相关名称的使用。)
related_name
应该是复数形式,因为 ForeignKey 关系会返回多个对象。 - Mesut Tascirelated_name
参数在有更复杂的相关类名时也很有用。例如,如果你有一个外键关系:
class UserMapDataFrame(models.Model):
user = models.ForeignKey(User)
为了从相关的User
访问UserMapDataFrame
对象,通常的调用方式是User.usermapdataframe_set.all()
,但这种方式不太易读。
使用related_name
可以指定一个更简单或易读的名称来获取反向关系。在本例中,如果指定user = models.ForeignKey(User, related_name='map_data')
,则调用将变为User.map_data.all()
。
map_set
属性,允许通过m.map_set
访问您的示例(m是您的类实例)。 Django使用的公式是模型名称后跟字符串_set
。因此,related name参数仅覆盖Django的默认值,而不提供新行为。prefetch_related
用于预取Many to many和many to one关系数据。 select_related
用于从单值关系中选择数据。 两者都用于从模型的关系中获取数据。例如,您建立了一个与其他模型有关系的模型。当请求到来时,您还将查询其关系数据,Django具有非常好的机制来访问其关系数据,例如book.author.name
,但是当您迭代模型列表以获取其关系数据时,Django会为每个单个关系数据创建请求。为了克服这一点,我们有prefetchd_related
和selected_related
related_name
是一个好习惯,所以如果你知道自己不会使用它,那么我认为这是一件好事。当然,这只是个人意见。 - François Constant