何时在Django模型中使用一对一关系

ekr*_*rah 7 python django one-to-one models

我读过几个 地方(参见第二个答案),Django模型中的一对一关系几乎总是只用于继承,或访问其他无法访问的模型(如Django用户模型).

但是,似乎有些情况下你有一个对象,它总是只有一个另一个对象的实例,你在逻辑上想要将这两个对象分开.比如说,您的应用程序正在存储有关汽车的信息.每辆车只有一个司机,每个司机只开一辆车.将汽车和驾驶员分成两个独立的车型是不合理的?

cez*_*zar 12

想象一下,你有一个公司,并制作内部网工具列出所有员工,他们的职位,办公室,部门,工资等.你会在Django models.py一个类Employee,可能是这样的:

class Employee(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    position = models.CharField(max_length=255)
    office = models.CharField(max_length=20)
    salary = models.IntegerField()
    department = models.ForeignKey(Department, related_name='employees')
Run Code Online (Sandbox Code Playgroud)

但由于某些原因,您不希望所有员工都可以访问薪水,也许有很多人在管理区域中具有redactor状态,并决定将其外包给自己的模型并更改模型Employee:

class Employee(models.Model):
    # above attributes
    salary = models.OneToOneField(Salary)
Run Code Online (Sandbox Code Playgroud)

当然还有其他方法可以隐藏这些信息,但有一种可能性就是将信息分成两个表,即使它只是简单的1:1关系.

您的公司是一家软件公司,您引入了结对编程.每个员工都有一对编程合作伙伴.它可以只是一个编程合作伙伴.所以你再次调整你的模型:

class Employee(models.Model):
    # above attributes
    pair_programmer = models.OneToOneField('self')
Run Code Online (Sandbox Code Playgroud)

这将是递归的一对一关系.

一对一的关系并不常见,很难在初学者的教程中找到,但如果有一些特定的要求,你会发现自己创建了1:1的关系来解决问题.

这是我作品中的真实例子.我是生物信息学家,为微生物制作软件.它们属于属和种.每个属都可能包含一个或多个物种,但一个物种只能属于一个物种.这是一个明确的1:n关系.但现在,属一种类型,只有一种,只有一种.类型物种可属于一个属.我放在这里models.OneToOneField,除了models.ForeignKey.

不要过早担心1:1的关系.当你遇到一些具体问题时,你会发现你是否需要1:1的关系.