有人能告诉我什么是反向关系意味着什么? 我已经开始使用Django了,在文档的很多地方,我看到'反向关系,被提及。这是什么意思?为什么有用?在引用this post?
时,它与related_name有什么关系?答案 0 :(得分:28)
以下是related_name
的文档假设您有2个模型
class Group(models.Model):
#some attributes
class Profile(models.Model):
group = models.ForeignKey(Group)
#more attributes
现在,您可以从个人资料对象profile.group
进行操作。但是如果你想要给出group
对象的配置文件对象,你会怎么做?那就是related name
或reverse relationship
进来的地方。
Django默认为你提供一个默认的related_name
,它是ModelName(小写)后跟_set
- 在这种情况下,它会是profile_set
,所以{{1} }。
但是,您可以通过在group.profile_set
字段中指定related_name
来覆盖它。
ForeignKey
现在,您可以按如下方式访问外键:
class Profile(models.Model):
group = models.ForeignKey(Group, related_name='profiles')
#more attributes
答案 1 :(得分:0)
在Django 2.0中,您将如下定义一个ForeignKey
mainclient = models.ForeignKey( MainClient, on_delete=model.CASCADE, related_name='+')
related_name='+'
将取消Django设置的默认反向关系,因此在上一个示例中,您将无法使用group.profiles.all()
查询配置文件。
答案 2 :(得分:0)
为了更清晰的图片,您可以假设当我们使用反向关系时,它会在引用的模型中添加一个额外的字段:
例如:
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()
然后对其进行迭代。