Django什么是反向关系?

时间:2013-06-26 19:34:45

标签: python django

有人能告诉我什么是反向关系意味着什么? 我已经开始使用Django了,在文档的很多地方,我看到'反向关系,被提及。这是什么意思?为什么有用?在引用this post

时,它与related_name有什么关系?

3 个答案:

答案 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 namereverse 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)

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

例如:

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

例如,可用字段现在是:

nameemailsalary

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

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

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

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

答案 2 :(得分:0)

在Django 2.0中,您将如下定义一个ForeignKey

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

related_name='+'将取消Django设置的默认反向关系,因此在上一个示例中,您将无法使用group.profiles.all()查询配置文件。