模型关系

关系数据库的威力体现在表之间的相互关联,Django提供了三种最常见的数据库关系:多对一

(many-to-one),多对多(many-to-many),一对一(one-to-one)

  • 多对一关系
  • 多对多关系
  • 一对一关系

多对一

  • django是使用django.db.models.ForeignKey 定义多对一关系
  • ForeignKey需要一个位置参数来指定本Model关联的Model,ForeignKey关联的Model

    是"一", ForeignKey所在的Model是"多"

比如汽车和制造商的例子,一辆汽车只能属于一个制造商,但是一个制造商有多辆汽车,这个关系,用Django的Model来表示,就是

#一
class Manufacturer(models.Model):
name = models.CharField(max_length=30)
#多
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer)
name = models.CharField(max_length=30)

多对一查询

  • 正向查询( ForeignKey 所在的模型查询关联的模型)
car = Car.objects.get(pk=2)
car.manufacturer #返回一条Manufacturer 对象
  • 反向查询( ForeignKey 指向的模型查询ForeignKey 所在的模型)
  • 如果模型有一个ForeignKey,那么该ForeignKey 所指的模型实例可以通过一个管理器返回前一个有ForeignKey的模型的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。该管理器返回的查询集可以用上一节提到的方式进行过滤和操作。
manufacturer = Manufacturer.objects.get(pk=1)
manufacturer.car_set.all() # 返回多个car对象

处理关联对象的其它方法

  • add(obj1, obj2, ...) #添加一指定的模型对象到关联的对象集中。
  • create(**kwargs) #创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对

    象。
  • remove(obj1, obj2, ...) #从关联的对象集中删除指定的模型对象。
  • clear() #从关联的对象集中删除所有的对象

多对多

  • 要实现多对多,就要使用django.db.models.ManyToManyField类,和ForeignKey一样,它也有一个位置参数,用来指定和它关联的Model。
  • 如果不仅仅需要知道两个Model之间是多对多的关系,还需要知道这个关系的更多信息,比如Person和Group是多对多的关系,每个person可以在多个group里,那么group里可以有多个person

多对多示例

class Group(models.Model):
name = CharField(max_length=50)
#...
class Person(models.Model):
name = CharField(max_length=50)
groups = models.ManyToManyField(Group)
  • 建议以被关联模型名称的复数形式做为 ManyToManyField 的名字
  • 在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可——不要在两个模型中都设置

一对一

  • 一对一是通过django.db.models.OneToOneField来实现的,被关联的Model会被加上

    Unique的限制,OneToOneField要一个位置参数,与模型关- 联的类
  • 当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系

django 模型关系的更多相关文章

  1. 八.django模型系统(二)之常用查询及表关系的实现

    Ⅰ.常用查询  1.几个概念 每一个django模型类,都有一个默认的管理器,objects,查询就是依赖于objects管理器进行的(在创建时就被添加了). QuerySet表示数据库中对象的列表( ...

  2. django模型中的关系对应

    显然,关系数据库的力量在于将表相互关联.Django提供了定义三种最常见的数据库关系类型的方法:多对一,多对多和一对一. 在说明之前,首先来理解一下这三个概念: 多对一: 两个集合a,b;集合a中的多 ...

  3. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  4. django模型中有外键关系的表删除相关设置

    0904自我总结 django模型中有外键关系的表删除相关设置 一.一对一 例如有Author.AuthorDetail两表 author = models.OneToOneField(to='Aut ...

  5. Django模型层Meta内部类详解

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract      这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...

  6. django模型

    用django时,只要用到数据库就得用到模型. 一.数据库的MTV开发模式 从MVC到MTV 所谓软件架构的MVC模式将数据的存取逻辑(Module),表现逻辑(View)和业务逻辑(Controll ...

  7. 【Python】django模型models的外键关联使用

    Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...

  8. django模型中的抽象类(abstract)

    首先介绍下django的模型有哪些属性:先看例子: Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模 ...

  9. Django模型之Meta选项详解

    Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类.所谓抽象类是不会对应数据 ...

随机推荐

  1. scrapy爬虫框架处理流程简介

    1.SPIDERS的yeild将request发送给ENGIN2.ENGINE对request不做任何处理发送给SCHEDULER3.SCHEDULER( url调度器),生成request交给ENG ...

  2. 安装64位office时,弹出提示,要求卸载32位office

    运行 regedit,进入到HKEY_CLASSES_ROOT\Installer\Products下,删除0000510开头的项或00002开头项.然后重启计算机. 参考:  https://blo ...

  3. Linux redhat 7 进入单用户模式

    redhat  7 进入单用户模式修复系统故障 1.启动机器,grub界面选择第一个,按e 2.往下翻,找到Linux16 开头的那一行 3.将ro改为"rw init=/sysroot/b ...

  4. C语言变量声明内存分配

    转载: C语言变量声明内存分配   一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

  5. VS打开SSAS或SSIS报错的解决办法

    ---------------------------Microsoft Visual Studio---------------------------无法加载类型为“Microsoft.Analy ...

  6. kalman滤波(三)---各种滤波的方法汇总+优化的方法

    大神解答 一.前提 最一般的状态估计问题,我们会根据系统是否线性,把它们分为线性/非线性系统.同时,对于噪声,根据它们是否为高斯分布,分为高斯/非高斯噪声系统.现实中最常见的,也是最困难的问题,是非线 ...

  7. CRM中QueryDict和模型表知识补充

    CRM中QueryDict和模型表知识补充 1.QueryDict的用法 request.GET的用法:1.在页面上输入:http://127.0.0.1:8000/index/print(reque ...

  8. java 小心使用float和double他可能不如你所想

    public static void main(String[] args) { double funds=1.00; ; // ; ;funds>=price;price+=.){ funds ...

  9. redis在游戏服务器中的使用初探(二) 客户端开源库选择

    上文提到 搭建完成后 我们选择客户端的开源库进行连接 有以下三种选择 1 acl-redis 原因是支持VC 国产  作者博客   acl 框架库简介  用 acl 库编写高效的 C++ redis ...

  10. 使用Maven搭建SpringMVC

    1.创建Maven Project 注意选择webapp 2.添加Maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...