Django模型中的OneToOneField和ForeignKey有什么区别?
说是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,侵删
推荐阅读
-
java中的值传递和引用传递有什么区别呀?
-
Flask和Django框架中自定义模型类的表名、父类相关问题分析
-
java中的Exception和Error有什么区别?
-
java中的URLConnection和HttpURLConnection有什么区别(因为我自己搜到别人写的区别看下来都没有什么区别)
-
苹果Mac系统中的清倒废纸篓和安全清倒废纸篓有什么区别?
-
Django模型中的OneToOneField和ForeignKey有什么区别?
-
诸葛亮为什么会受到后人的推崇 正史和演义中的诸葛亮有什么区别
-
AI散点画笔中的固定和随机有什么区别?
-
php 中的session 和cakephp中的session有什么区别,该怎么解决
-
console.log中的“,”和“+”有什么区别?