清屏死光,九江汽车,赶集帮帮登陆
说是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)
引自,侵删
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论