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,侵删

原文地址:https://www.cnblogs.com/luowenConnor/p/11563573.html

时间: 2024-09-29 09:21:24

Django模型中的OneToOneField和ForeignKey有什么区别?的相关文章

Django 模型中FileField字段

FileField¶ class FileField([upload_to=None, max_length=100, **options])¶ 一个上传文件的字段. 注意 FileField字段不支持primary_key 和unique参数,如果使用会生成 TypeError错误 有两个可选参数: FileField.upload_to¶ Changed in Django 1.7: 在旧版本Django中,upload_to 属性是必须要有的; 这将会添加一个本地文件系统路径到 MEDIA

django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结构已经整体固定下来,并且有外键关联到了这个自定义的的主键,整个后台视图逻辑也已经封装完成,如果主表的主键发生改变,那么外键所在的表就会默认关联到新的主键上,那个后台视图的改动就会非常麻烦,这时就需要使用外键字段中的to_field属性来指定所关联的主表的某个字段,而不会影响到原先的逻辑 demo如下

django模型中的__str__()方法和__unicode__()方法

在Django中,如果用的是Python3的话就只能用__str__方法,如果是Python2的话就使用__unicode__方法.因为更安全一些. 作用:没加之前在admin后台看到的是一个对象,加了以后看到的是一个字段的值.如下两个图的区别: 原文地址:https://www.cnblogs.com/pythonchen/p/10116390.html

Django 模型中DateField字段

DateField¶ class DateField([auto_now=False, auto_now_add=False, **options])¶ 这是一个使用Python的datetime.date实例表示的日期. 有几个额外的设置参数: DateField.auto_now¶ 每次保存对象时,自动设置该字段为当前时间.用于"最后一次修改"的时间戳. 注意,它总是使用当前日期; 它不是一个您可以重写的默认值. DateField.auto_now_add¶ 当对象第一次被创建时

Django 模型中的CRUD

一.通过 ORM 向 DB 中增加数据 1.Entry.objects.create(属性=值,属性=值) Entry:具体要操作的Model类 ex: Author.objects.create(name='zsf',age=85) 2.创建一个 Models 对象,通过对象的 save() 完成增加 author = Author(names='laoshe',age=65)author.save() 3.使用字典构建属性,通过 save() 完成增加 dic = { '属性1':'值1',

盒模型中padding、border、margin的区别

在CSS中,规定了一种基本设计模型--盒模型(也叫框模型),如图所示: 其中包含了四部分内容:element/元素(即图中文字).padding/内边框(图中两个红色边框之间白色部分).border/边框(蓝色区域).margin/外边框(图中两绿色边框中间白色部分). 区别: element占据的就是字体本身的字号大小: padding和margin 类似,指的是一段距离,只能设置上.下.左.右方向的一段长度,不能设置区域颜色: 而border指的是一块区域,可以设置上下左右方向的长度,而且可

Django模型的_meta编程

Python有反射机制,Django也不例外,也有很好的反射机制,每个Django模型都有一个属性_meta,_meta也有属性和方法,这些属性和方法反射出了模型的一些特性,如果_meta用的好的话,不仅可也是代码更加优美,而且还可以大大提高代码的通用性和重复利用性.下面主要介绍_meta的属性和方法. 在django项目中,定义一个模型,然后用dir()函数打印出该模型的_meta的属性和方法,结果如下: _meta的属性和方法 '__class__', '__delattr__', '__d

4Python全栈之路系列之Django模型

Python全栈之路系列之Django模型 MTV开发模式 把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的Model-View-Controller(MVC)模式.在这个模式中,Model代表数据存取层,View代表的是系统中选择显示什么和怎么显示的部分,Controller指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分. Django紧紧地遵循这种MVC模式,可以称得上是一种MVC框架. 以下是Django中M.V和C各自的含义: **M**: 数

Django 模型 - 模型的定义

Django也遵循了MVC的分层原则,不过在做法上略有不同.    首先模型部分保持不变:Django的模型增只负责把数据传入传出数据库.然而Django里的视图却并不是显示数据的最后一步----Django的视图其实更接近MVC里传统意义上的控制器.他们是用来将模型层和表示层(有HTML和Django的模板语言组成)链接在一起的python函数.按Django开发团队的话老说就是: 我们理解的MVC里,视图的作用是描述将要显示给用户的数据.这不仅仅是数据看上去的外观,含包括如何表示数据.视图描