<p>假设您有一家公司,并使intranet工具列出所有员工、他们的职位、办公室、部门、薪水等。您将在Django models.py中创建一个类员工,可能如下所示:</p>
<pre><code>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')
</code></pre>
<p>但由于某些原因,您不希望所有员工都可以访问薪资,可能在管理区域中有许多具有redactor身份的人,决定将其外包给自己的模型并更改模型员工:</p>
<pre><code>class Employee(models.Model):
# above attributes
salary = models.OneToOneField(Salary)
</code></pre>
<p>当然还有其他方法隐藏这些信息,但有一种可能是将这些信息分成两个表,即使它们只是简单的1:1关系。</p>
<p>你的公司是一家软件公司,你介绍配对编程。每个员工都有一个配对编程伙伴。它可以只是一个编程伙伴。所以你要重新调整你的模式:</p>
<pre><code>class Employee(models.Model):
# above attributes
pair_programmer = models.OneToOneField('self')
</code></pre>
<p>这将是一个递归的一对一关系。</p>
<p>一对一的关系并不常见,在初学者的教程中很难找到,但是如果有一些特定的要求,您会发现自己创建了1:1的关系来解决问题。</p>
<p>这是我工作中的一个真实的例子。我是生物信息学家,为微生物制作软件。它们按属和种分类。每个属可以包含一个或多个种,但一个种只能属于一个属。这是一个明确的1:n关系。但现在,一个属有一个模式种,只有一个而且只有一个。模式种可以属于一个属。我把<code>models.OneToOneField</code>放在这里,除了<code>models.ForeignKey</code>。</p>
<p>事先不要太担心1:1的关系。当你遇到一些具体的问题时,你会发现你是否需要1:1的关系。</p>