Django中的OneToOneField和ForeignKey有什么区别?


当前回答

OneToOneField(例如:一辆车有一个车主) ForeignKey(OneToMany)(例如:一个餐厅有很多项目)

其他回答

ForeignKey允许你接收子类,它是另一个类的定义,但OneToOneFields不能这样做,它不能附加到多个变量

绘制项目之间关系的最简单方法是用简单的语言理解它们。例子

一个用户可以有很多辆车,但一辆车只能有一个车主。建立此关系后,应将外键用于关系较多的项上。在这种情况下,是汽车。这意味着您将在cars中包含user作为外键

一对一的关系很简单。说一个男人和一颗心。一个人只有一颗心,而一颗心只能属于一个人

OneToOneField(一对一)在面向对象中实现了组合的概念,而ForeignKey(一对多)则与聚合有关。

在Django最终指南中,OneToOneField(SomeModel)和ForeignKey(SomeModel, unique=True)的区别如下:

一对一字段 一对一的关系。从概念上讲,这类似于带有unique=True的ForeignKey,但是关系的“反向”端将直接返回单个对象。

与OneToOneField“反向”关系相反,ForeignKey“反向”关系返回一个QuerySet。

例子

例如,如果我们有以下两个模型(完整的模型代码如下):

汽车模型使用OneToOneField(引擎) Car2模型使用ForeignKey(Engine2, unique=True)

在python manage.py shell中执行以下命令:

一对一字段的例子

>>> from testapp.models import Car, Engine
>>> c = Car.objects.get(name='Audi')
>>> e = Engine.objects.get(name='Diesel')
>>> e.car
<Car: Audi>

ForeignKey with unique=True示例

>>> from testapp.models import Car2, Engine2
>>> c2 = Car2.objects.get(name='Mazda')
>>> e2 = Engine2.objects.get(name='Wankel')
>>> e2.car2_set.all()
[<Car2: Mazda>]

模型代码

from django.db import models

class Engine(models.Model):
    name = models.CharField(max_length=25)

    def __unicode__(self):
        return self.name

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine)

    def __unicode__(self):
        return self.name

class Engine2(models.Model):
    name = models.CharField(max_length=25)

    def __unicode__(self):
        return self.name

class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True, on_delete=models.CASCADE)

    def __unicode__(self):
        return self.name

我也对这两个字段的用法感到困惑。 让我举一个例子来理解它们的用法,因为我最近遇到了这个问题,并意识到这两个字段的用法。

我有一个模型,像这样

from django.contrib.auth.models import User
from django.db import models


class Attendance(models.Model):
     user = models.OneToOneField(User, on_delete=models.CASCADE, default="", null=True)
     date = models.CharField(max_length=11)

     def __int__(self):
         return self.id

现在这个的问题是我不能用同一个用户创建多个对象, 也就是说,同一个用户将在多个日子里出席会议。因此,同一个用户有多个对象。

但是一对一领域不允许我这么做。 参考图片

所以我把模型改成-

from django.contrib.auth.models import User
from django.db import models


class Attendance(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default="", null=True)
    date = models.CharField(max_length=11)

    def __int__(self):
        return self.id

现在它工作得很好,我可以标记一个用户在多天的出席。

这就是区别所在,OneToOne字段不允许你用同一个用户创建多个对象(举个例子),但是使用ForeignKey是可以的。