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

zjm*_*126 339 python django many-to-many foreign-key-relationship

什么是related_name对on ManyToManyFieldForeignKey字段有用的参数?例如,给出以下代码,有什么影响related_name='maps'

class Map(db.Model):
    members = models.ManyToManyField(User, related_name='maps',
                                     verbose_name=_('members'))
Run Code Online (Sandbox Code Playgroud)

Wog*_*gan 448

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文档有更多的细节.

  • 如果你添加+,django会禁用映射 (9认同)
  • 我使用Django 2.1.3,我可以注意到它们是独占的.一旦指定了"related_name",`_set`就不再起作用了. (6认同)
  • 好吧,我知道这是一个旧帖子。但我只是想弄清楚这一点 - 相关名称末尾的 + 技巧是什么?例如,如果我在上面的例子中做了 `related_name='maps+'` 会发生什么? (4认同)
  • 对于OneToOneField,默认的related_name将是小案例类名.例如,在给定的示例中,如果成员是OneToOnefield,则"User.map"将起作用. (4认同)

Ily*_*bik 70

要添加到现有答案相关名称是必须的,以防模型中有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)
Run Code Online (Sandbox Code Playgroud)

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

 bom = material.tomaterial.all().order_by('-creation_time')
Run Code Online (Sandbox Code Playgroud)

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

  • `related_name`应该是复数.因为ForeignKey关系返回多个对象. (23认同)
  • 您必须至少为其中一个选择一个related_name.另一个并不需要. (2认同)

Mr.*_*Jha 8

你的问题的要点如下。

由于您拥有MapUser模型并且您已经ManyToManyField在 Map 模型中定义,如果您想访问Map 的成员,那么您可以选择map_instance.members.all()因为您已经定义了成员字段。但是,假设您要访问用户所在的所有地图,那么您有什么选择。

默认情况下,Django 为您提供user_instance.modelname_set.all()了,user.map_set.all()在这种情况下,这将转换为。

mapsmap_set 好得多

related_name为您提供了一种能力,让 Django 知道您将如何从 User 模型访问 Map 或者通常如何访问反向模型,这是创建 ManyToMany 字段和在这种意义上使用 ORM 的重点。

  • 访问 https://www.revsys.com/tidbits/tips-using-djangos-manytomanyfield/ 了解有关 Django 中 ManyToMany 字段的更多信息 (2认同)

Dan*_*mes 7

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

class UserMapDataFrame(models.Model):
    user = models.ForeignKey(User) 
Run Code Online (Sandbox Code Playgroud)

为了UserMapDataFrame从related中访问对象User,默认调用将是User.usermapdataframe_set.all(),这很难阅读。

使用,related_name您可以指定一个更简单或更清晰的名称来获取反向关系。在这种情况下,如果您指定user = models.ForeignKey(User, related_name='map_data'),则呼叫将为User.map_data.all()


Abr*_*rar 5

相关的名称参数实际上是一个选项。如果我们不设置它,Django\n会自动为我们创建关系的另一端。对于 Map 模型,Django 将创建一个map_set属性,允许通过m.map_set您的示例(m 是您的类实例)进行访问。Django 使用的公式是模型名称后跟\n字符串_set。因此,相关的名称参数只是覆盖 Django\xe2\x80\x99s 默认值,而不是提供新的行为。

\n