欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-02 13:13:55
说是ForeignKey是one to many的,并举了一个车的例子: 有两个配件表,一个是车轮表,另一个是引擎表。两个表都有一个car字段,表示该配件对应的车。 对于车轮来说,多个对应一个car的情况很正常,所以car字段应该用ForeignKey来表示。 对于引擎来说,一个引擎只可能对应一个c ......

说是foreignkey是one-to-many的,并举了一个车的例子:

有两个配件表,一个是车轮表,另一个是引擎表。两个表都有一个car字段,表示该配件对应的车。
对于车轮来说,多个对应一个car的情况很正常,所以car字段应该用foreignkey来表示。
对于引擎来说,一个引擎只可能对应一个car,所以必须用onetoonefield。

onetoonefield(somemodel) 可以理解为 foreignkey(somemodel, unique=true)。

两者的反向查询是有差别的:

foreignkey反向查询返回的是一个列表(一个车有多个*)。

onetoonefield反向查询返回的是一个模型示例(因为一对一关系)。

另外的补充说明:

be careful to realize that there are some differences between onetoonefield(somemodel) andforeignkey(somemodel, unique=true). as stated in the definitive guide to django:

onetoonefield

a one-to-one relationship. conceptually, this is similar to a foreignkey with unique=true, but the "reverse" side of the relation will directly return a single object.

in contrast to the onetoonefield "reverse" relation, a foreignkey "reverse" relation returns aqueryset.

example
for example, if we have the following two models (full model code below):

car model uses onetoonefield(engine)
car2 model uses foreignkey(engine2, unique=true)
from within python manage.py shell execute the following:

onetoonefield example
>>> 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 example
>>> from testapp.models import car2, engine2
>>> c2 = car2.objects.get(name='mazda')
>>> e2 = engine2.objects.get(name='wankel')
>>> e2.car2_set.all()
[<car2: mazda>]

model code

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)

引自redice,侵删