Django中的OneToOneField和ForeignKey有什么区别?
当前回答
此外,OneToOneField可用作主键以避免键重复。可能没有隐式/显式autofield
models.AutoField(primary_key=True)
但是使用OneToOneField作为主键(假设UserProfile模型为例):
user = models.OneToOneField(
User, null=False, primary_key=True, verbose_name='Member profile')
其他回答
OneToOneField(例如:一辆车有一个车主) ForeignKey(OneToMany)(例如:一个餐厅有很多项目)
绘制项目之间关系的最简单方法是用简单的语言理解它们。例子
一个用户可以有很多辆车,但一辆车只能有一个车主。建立此关系后,应将外键用于关系较多的项上。在这种情况下,是汽车。这意味着您将在cars中包含user作为外键
一对一的关系很简单。说一个男人和一颗心。一个人只有一颗心,而一颗心只能属于一个人
在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
ForeignKey允许你接收子类,它是另一个类的定义,但OneToOneFields不能这样做,它不能附加到多个变量
OneToOneField:如果第二个表与
table2_col1 = models.OneToOneField(table1,on_delete=models.CASCADE, related_name='table1_id')
Table2将只包含一条对应于table1的pk值的记录,即table2_col1将有一个等于表pk的唯一值
table2_col1 == models.ForeignKey(table1, on_delete=models.CASCADE, related_name='table1_id')
Table2可以包含多条与table1的pk值相对应的记录。
推荐文章
- django MultiValueDictKeyError错误,我如何处理它
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- Django - makemigrations -未检测到任何更改
- ">", "<", ">=" 和“< =”不工作”在Django过滤()”
- Django项目工作目录结构的最佳实践
- 如何在Django中表达一对多关系?
- 用Django创建电子邮件模板
- Django的嵌套元类是如何工作的?
- 用Django实现OpenID的最佳解决方案是什么?
- 在使用信号时,你不能在'原子'块的末尾执行查询,但只能在单元测试期间执行
- Django查询- id vs pk
- render(), render_to_response()和direct_to_template()之间有什么区别?
- 如何使用MySQLdb与Python和Django在OSX 10.6?
- 如何在Django中一次添加多个对象到ManyToMany关系?