Django模型中的OneToOneField和ForeignKey有什么区别?
2021-01-22 07:12
标签:turn lock dice with key http elf obj any 转自:Django模型中的OneToOneField和ForeignKey有什么区别? 在stackoverflow发了个帖子问这个问题(http://stackoverflow.com/questions/5870537/whats-the-difference-between-django-onetoonefield-and-foreignkey),马上就有人回复了: 说是ForeignKey是one-to-many的,并举了一个车的例子: 有两个配件表,一个是车轮表,另一个是引擎表。两个表都有一个car字段,表示该配件对应的车。 OneToOneField(someModel) 可以理解为 ForeignKey(SomeModel, unique=True)。 两者的反向查询是有差别的: ForeignKey反向查询返回的是一个列表(一个车有多个轮子)。 OneToOneField反向查询返回的是一个模型示例(因为一对一关系)。 另外的补充说明: 另外的补充说明: 请注意, 一对一 一对一的关系。从概念上讲,这与 与 例如,如果我们有以下两个模型(下面的完整模型代码): 从内部 Django模型中的OneToOneField和ForeignKey有什么区别? 标签:turn lock dice with key http elf obj any 原文地址:https://www.cnblogs.com/bailongcaptain/p/13288705.html
对于车轮来说,多个对应一个car的情况很正常,所以car字段应该用ForeignKey来表示。
对于引擎来说,一个引擎只可能对应一个car,所以必须用OneToOneField。OneToOneField(SomeModel)
和之间存在一些差异 ForeignKey(SomeModel, unique=True)
。如《 Django权威指南》所述 :
ForeignKey
with 相似 unique=True
,但是关系的“反向”侧将直接返回单个对象。OneToOneField
“反向”关系相反, ForeignKey
“反向”关系返回a QuerySet
。例
Car
模型用途 OneToOneField(Engine)
Car2
模型用途 ForeignKey(Engine2, unique=True)
python manage.py shell
执行以下操作:
OneToOneField
例>>> from testapp.models import Car, Engine
>>> c = Car.objects.get(name=‘Audi‘)
>>> e = Engine.objects.get(name=‘Diesel‘)
>>> e.car
ForeignKey
与 unique=True
例子>>> from testapp.models import Car2, Engine2
>>> c2 = Car2.objects.get(name=‘Mazda‘)
>>> e2 = Engine2.objects.get(name=‘Wankel‘)
>>> e2.car2_set.all()
[
型号代码
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)
def __unicode__(self):
return self.name
上一篇:python100例 1-10
文章标题:Django模型中的OneToOneField和ForeignKey有什么区别?
文章链接:http://soscw.com/essay/45332.html