根据 documentation ,相关名称必须是唯一的。再次根据 documentation 的默认值(如果开发人员未明确设置)是 FOO_set
,其中 FOO
是源模型名称。
因此,如果我有两个外键(当然,指向两个不同的模型),那么(默认)相关名称不会相似吗?
最佳答案
我想扩展 Willem Van Onsem 的出色回答。在他的例子中,类 C 与类 A 和 B 相关。因此 A 和 B 具有属性 c_set
,但它们是不同的类。因此,具有相同名称的属性 c_set
存在于不同的范围(命名空间)中。
但是如果关系是不同的性质呢?让我们看一个不同的例子。想象一个运动队的应用程序。我们有Person 和Team 类。一个人可以为一支球队效力,也可以执教一支球队。模型看起来像:
class Person(models.Model):
name = models.CharField(max_length=255, unique=True)
class Team(models.Model):
name = models.CharField(max_length=255, unique=True)
place = models.CharField(max_length=255)
players = models.ManyToManyField('Person')
coaches = models.ManyToManyField('Person')
现在这应该为类 Person 创建一个属性
team_set
:person = Person.objects.get(pk=1)
# now we want to get the teams where the person participates
person.team_set.all()
问题来了!应该使用哪个关系 -
players
或 coaches
? Django 不允许这样做并要求明确声明相关名称。我们可以通过声明相关名称来解决问题,例如:
players = models.ManyToManyField('Person', related_name='plays_in_teams')
coaches = models.ManyToManyField('Person', related_name='trains_teams')
进行此更改后,我们可以查询团队,例如:
person.plays_in_teams.all()
person.trains_teams.all()
这显示了相关名称的用处。它们有助于创建人类可读的查询并提高代码的可维护性。
关于Django related_name 默认语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51702211/