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

Python 何时在Django模型中使用一对一关系,python,django,models,one-to-one,Python,Django,Models,One To One,我已经读到(见第二个答案),Django模型中的一对一关系几乎总是只用于继承,或者访问其他不可访问的模型(如Django用户模型) 然而,似乎在某些情况下,您有一个对象,该对象始终恰好有另一个对象的一个实例,您在逻辑上希望将这两个对象分开。比如说,你的应用程序存储了关于汽车的信息。每辆车只有一个司机,每个司机只开一辆车。将汽车和驾驶员分为两种不同的车型没有意义吗?django文档给出了一个: 例如,如果你正在建立一个“地点”数据库,你会 在数据库中建立相当标准的东西,如地址、电话号码等 数据库然

我已经读到(见第二个答案),Django模型中的一对一关系几乎总是只用于继承,或者访问其他不可访问的模型(如Django用户模型)


然而,似乎在某些情况下,您有一个对象,该对象始终恰好有另一个对象的一个实例,您在逻辑上希望将这两个对象分开。比如说,你的应用程序存储了关于汽车的信息。每辆车只有一个司机,每个司机只开一辆车。将汽车和驾驶员分为两种不同的车型没有意义吗?

django文档给出了一个:

例如,如果你正在建立一个“地点”数据库,你会 在数据库中建立相当标准的东西,如地址、电话号码等 数据库然后,如果你想在网上建立一个餐馆数据库 最重要的地方,而不是重复你自己和复制这些 在餐厅模型中,您可以使餐厅拥有 OneToOneField to Place(因为餐厅“是”一个地方;事实上,是指 处理这个你通常会使用的方法是:每辆车只有一个司机,而每个司机只开一辆车。分开一辆车是没有意义的,因为这需要一个 隐式一对一关系)


Django使用OneToOne来建模继承(可能在内部使用,但我还没有检查源代码)。我觉得如果django提供了一个工具,你可以用一种你可以保护的方式使用它,为什么不使用它呢?这似乎是有道理的,如果一辆车只有一个司机,那么在db中使用django提供的工具(OneToOneField)强制执行这一点

假设您有一家公司,并制作内联网工具,列出所有员工、他们的职位、办公室、部门、工资等。您将在django models.py中创建一个类员工,也许是这样的:

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')
但是,由于某些原因,您不希望所有员工都能访问薪资,可能在管理区域有许多具有编校者身份的人,决定将其外包到自己的模型中,并更改模型员工:

class Employee(models.Model):
    # above attributes
    salary = models.OneToOneField(Salary)
当然还有其他方法可以隐藏此信息,但有一种可能性是将信息分成两个表,即使它只是简单的1:1关系

您的公司是一家软件公司,您引入了结对编程。每个员工都有一个结对编程伙伴。它可以只是一个编程伙伴。因此,您需要再次调整您的模型:

class Employee(models.Model):
    # above attributes
    pair_programmer = models.OneToOneField('self')
这将是一个递归的一对一关系

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

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


事先不要太担心1:1的关系。当你遇到一些特定的问题时,你会发现你是否需要1:1的关系。

我会更多地考虑用户和用户配置文件——一个用户可以在一个典型的应用程序中拥有一个用户配置文件(嗯……在大多数情况下)。我不知道你的意思。你是说用户和用户配置文件应该在一个模型中,还是在不同的模型中?我认为人们通常只是将User和UserProfile作为单独的模型,因为你不能直接使用django用户模型。我读了这篇文章,发现它很有用,但我想更具体地了解两个完全不同但仍然相关的模型。在他们在文档中提到的情况下,公认的“最佳实践”似乎是使用继承。