38

谁能告诉我反向关系是什么意思?我已经开始使用 Django,并且在文档中的很多地方我都看到了“反向关系”。它到底是什么意思?为什么有用?参考这篇文章,它与 related_name 有什么关系?

4

3 回答 3

79

Here is the documentation on related_name

Lets say you have 2 models

class Group(models.Model):
    #some attributes

class Profile(models.Model):
    group = models.ForeignKey(Group)
    #more attributes

Now, from a profile object, you can do profile.group. But if you want the profile objects given the group object, How would you do that? Thats' where related name or the reverse relationship comes in.

Django, by defaults gives you a default related_name which is the ModelName (in lowercase) followed by _set - In this case, It would be profile_set, so group.profile_set.

However, you can override it by specifying a related_name in the ForeignKey field.

class Profile(models.Model):
    group = models.ForeignKey(Group, related_name='profiles')
    #more attributes

Now, you can access the foreign key as follows:

group.profiles.all()
于 2013-06-26T19:43:15.100 回答
2

为了更清晰的画面,您可以假设当我们使用反向关系时,它会在引用模型中添加一个额外的字段:

例如:

class Employee(models.Model):
           name = models.CharField()
           email = models.EmailField()
class Salary(models.Model):
           amount = models.IntegerField()
           employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='salary')

在 Salary 模型中使用 related_name 后,现在您可以假设 Employee 模型将多出一个字段:salary

例如,现在可用的字段是:

name, email, 和salary

要查找员工,我们可以这样简单地查询:

e = Employee.objects.filter(some filter).first()

要查看他们的薪水,我们可以通过写来查看 e.salary(现在我们可以在员工模型中使用薪水作为属性或字段)。这将为您提供该员工的薪水实例,您可以通过编写找到金额e.salary.amount。这将为您提供该员工的薪水。

在多对多关系的情况下,我们可以使用.all()然后对其进行迭代。

于 2021-02-08T20:32:45.647 回答
0

在 Django 2.0 中,您将按如下方式定义 ForeignKey

mainclient = models.ForeignKey( MainClient, on_delete=model.CASCADE, related_name='+')  

related_name='+'取消 Django 设置的默认反向关系,因此在前面的示例中,您将无法使用group.profiles.all().

于 2018-07-03T01:28:06.940 回答