Python Django 开发 4 ORM

第三篇最后写了,光知道那些基础的查询在项目中是没有什么卵用的,重点是实体关系映射(ORM),今天学习了,来记录一下,关键词:ForeignKey(多对一)、OneToOneField(一对一)、ManyToManyField(多对多)

实体定义:

 1 from django.db import models
 2
 3 # Create your models here.
 4 class Publisher(models.Model):
 5     name = models.CharField(max_length=30)
 6     address = models.CharField(max_length=50)
 7     city = models.CharField(max_length=60)
 8     state_province = models.CharField(max_length=30)
 9     county = models.CharField(max_length=50)
10     website = models.URLField()
11
12     def __str__(self):
13         return self.name
14
15 class AuthorInfo(models.Model):
16     gender = models.IntegerField()
17     brithday = models.DateField()
18     join_time = models.DateTimeField()
19
20     def __str__(self):
21         return ‘this gender:‘+ str(self.gender)
22
23
24 class Author(models.Model):
25     frist_name = models.CharField(max_length=30)
26     last_name = models.CharField(max_length=40)
27     email = models.EmailField()
28     detail = models.OneToOneField(AuthorInfo)
29
30     def __str__(self):
31         return u‘%s %s‘ % (self.frist_name,self.last_name)
32
33
34
35
36 class Book(models.Model):
37     title = models.CharField(max_length=100)
38     authors = models.ManyToManyField(Author)
39     publisher = models.ForeignKey(Publisher)
40     publication_date=models.DateField()
41
42     def __str__(self):
43         return self.title
44
45     

在Navicat中简单拖了个模型:

一个出版社对应多本书,Book中通过外键ForeignKey来指定,一本书有多个作者,一个作者也会有多本书,所以这里是多对多关系(ManyToManyField),一个作者Author又会有详细信息,这里应该是一对一的关系(OneToOneField),最下面的表book_authors是Book实体中定义的ManyToManyField字段自动生成的,下面来插入数据

 1 #python shell 下
 2 >>>Publisher.objects.create(name=‘cbs1‘,address=‘xxx‘,city=‘yyy‘,state_province=‘zzz‘,county=‘China‘,website=‘Http://www.do-iot.net‘)
 3 >>>Publisher.objects.create(name=‘cbs2‘,address=‘xxx‘,city=‘yyy‘,state_province=‘zzz‘,county=‘China‘,website=‘Http://www.do-iot.net‘)
 4 >>>Publisher.objects.create(name=‘cbs3‘,address=‘xxx‘,city=‘yyy‘,state_province=‘zzz‘,county=‘China‘,website=‘Http://www.do-iot.net‘)
 5
 6 >>>AuthorInfo.objects.create(gender=1,brithday=‘2012-03-12‘,join_time=‘2013-03-04 12:21:32‘)
 7 >>>AuthorInfo.objects.create(gender=0,brithday=‘2012-03-12‘,join_time=‘2013-03-04 12:21:32‘)
 8 >>>AuthorInfo.objects.create(gender=1,brithday=‘2012-03-12‘,join_time=‘2013-03-04 12:21:32‘)
 9
10 >>>Author.objects.create(frist_name=‘John‘,last_name=‘Leb‘,email=‘[email protected]‘,detail=AuthorInfo.objects.get(id=1))
11 >>>Author.objects.create(frist_name=‘Susan‘,last_name=‘Jeerry‘,email=‘[email protected]‘,detail=AuthorInfo.objects.get(id=2))
12 >>>Author.objects.create(frist_name=‘Jerry‘,last_name=‘Brith‘,email=‘[email protected]‘,detail=AuthorInfo.objects.get(id=3))
13
14 >>>b = Book.objects.create(title=‘book1‘,publisher=Publisher.objects.get(id=1),publication_date=‘2015-06-30‘)
15 >>>b.authors.add(Author.objects.get(id=1))
16 >>>b = Book.objects.create(title=‘book2‘,publisher=Publisher.objects.get(id=2),publication_date=‘2015-06-30‘)
17 >>>b.authors.add(Author.objects.get(id=2))
18 >>>b = Book.objects.create(title=‘book2‘,publisher=Publisher.objects.get(id=3),publication_date=‘2015-06-30‘)
19 >>>b.authors.add(Author.objects.get(id=3))

一对一和一对多添加的方式差不多,多对多的需要先添加除ManyToManyField字段的数据,再在这个实体上添加ManyToManyField关联的对象,原先我数据都插入好了,这里写的都是现场手打的数据,可能会有bug,下面看下查询的方法

一对一OneToOneField:

通过用户查询用户详细信息:

1 >>>a = Author.objects.get(id=1)
2 >>>d = a.detail
3 <AuthorInfo:this gender:1>

也可以反向根据用户详细信息查询用户基本信息:

1 >>>d = AuthorInfo.objects.get(id=1)
2 >>>a = d.author
3 >>>a
4 <Author:Jack Jeeb>

这里注意反向查询要使用表关联的对象的小写类名

一对多ForeignKey:

通过书籍信息查询所属出版社信息:

1 >>>b = Book.objects.get(id=1)
2 >>>b.publisher
3 <Publisher:cbs1>

反向根据出版社查询所有出版的书:

1 >>>p = Publisher.objects.get(id=1)
2 >>>b_list = p.book_set.all()
3 >>>len(b_list)
4 2

注意这里查询使用小写关联的类名+"_set"来查询,后面的all()就跟普通的查询一样了,where、order_by等等

多对多ManyToManyField:

根据书籍查询作者:

1 >>>b = Book.objects.get(id=1)
2 >>>b.authors.all()
3 [<Author: Jack Jeeb>, <Author: Susan leb>]

反向根据作者查询书籍:

1 >>>a = Author.objects.get(id=1)
2 >>>a.book_set.all()
3 [<Book:book1>]

跟一对多反向查询差不多

理解这些一一般项目数据层都没有问题了(经验、毕竟是做了两三年的asp.net开发的大水B)

PS参考资料:

http://logic0.blog.163.com/blog/static/18892814620137343447299/

http://blog.csdn.net/fengyu09/article/details/17434795

时间: 2024-10-08 18:50:44

Python Django 开发 4 ORM的相关文章

Python/Django(CBA/FBA/ORM操作)

Python/Django(CBA/FBA/ORM操作) CBA:url对应的类(模式) 1 ##====================================CBA操作============================ 2 3 # class geting(View): 4 # def dispatch(self, request, *args, **kwargs): 5 # print('before') 6 # obj = super(geting,self).dispat

windows 7搭建python+django开发环境

windows 7 64位,搭建python+django 开发环境实践 一.安装python 因为要应用于京东云或百度云引擎,选择2.7.4.到python官网下载相应版本并安装.安装完成后,需要配置环境变量,Path中添加c:\python27,我直接安装在c盘根目录下. cmd输入python回车,进入python环境,ok结束 二.安装django  到官网下载相应版本包,然后解压,cmd工作目录切换到解压路径,运行python setup.py install 报错:ImportErr

使用 Visual Studio Code(VSCode)搭建简单的 Python + Django 开发环境

写在前面的话 作为有个 Python 菜逼,之前一直用的 Pycharm,但是在主题这一块怎么调整都感觉要么太骚,看起来不舒服,要么就是简直不能看.似乎用大 JB 公司 IDE 的人似乎都不怎么重视主题这个东西. 我个人是那种“喜新厌旧”的,所以看久了 Pycharm 就感觉很难受了,再加上 Pycharm 太笨重了,就换成了以前短时间用过的 VSCode,以前没用是懒得折腾插件,现在闲下来准备折腾一下! 这里放一张我现在的 Pycharm 的配色主题: 闲话少说,进入正题! 创建 Django

Python+django开发环境搭建

Python目前主版本有2个,2.7+和3.4+ 新入手,决定还是从2.7开始 先从python官网https://www.python.org/下载python2.7.10,64位版本(这里注意,选择了64位版本后,后面用到的python库也需要同样是64位的),python2.7用的还是vc9编译的,这个很重要,后续用到的库最好也是选择vc9编译出来的,否则容易出问题 安装完后,查看python版本 安装完python后,作为开发,肯定需要一个集成开发环境,安装完python后,python

python+django开发的运维工具——游戏内测服更新系统

这套系统,是学了python和django来,第一个正式开发好的小项目.小工具,只不过是,这套系统,需要优化的东西还很多,但目前也用的OK.年后回来,准备把新吸收的技术,开发正式服更新系统. 在这里,先感谢下老男孩运维培训机构,我的linux运维和python运维开发是从这里起步的,现在又准备报名他的mysql dba课程了.另外得感谢下刘天斯大神哈,从他出版的<Python自动化运维:技术与最佳实践>书上学了不少东西,并加入到了这个小工具中. 不啰嗦了,先工具图吧(以下图都截自我测试服上的,

python django中的orm外键级联删除

今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: 在网上查了一下资料,问题主要是django orm的field字段有关: routemgr = models.ForeignKey('Routemgr',default=1,blank=True,null=True,on_delete=models.SET_NULL) 主要意思就是把Routemg

Python Django 开发 2 数据库

一半教程用的Django都是1.8以前的版本,导致跟我用的1.8.2的版本用法有些出入,所以只能自己去官网看文档,以下一下是看官方文档而理解的,英语渣渣,可能会有理解有误的地方 先记录下如何查看django的版本: >>>python >>>import django >>>django.VERSION (1, 8, 2, 'final', 0) 把官网的那段示例Model copy过来,为了加深印象,我自己会手写一边: from django.db

基于Python Django开发的一个mock

最近研究了一下python的django框架, 发现这个框架不比Java spring boot差, mock同样一个接口, 代码量少很多, 维护起来也很方便, 废话不多说,直接上代码 1. 安装django: pip install django 2. 创建项目: django-admin startproject postdemo 3. 启动项目: python manage.py runserver 0.0.0.0:8001 启动Django项目就这么简单, 三步完成, O(∩_∩)O p

python django基础五 ORM多表操作

首先在创建表的时候看下分析一下 1.作者表和作者详细地址表  一对一关系 理论上谁都能当主表 把Author设置成主表 au=models.OneToOneField(to='AuthorDetail',to_field='id') 主表会多个au列 用于关联 2.书和出版社 一个出版社可以出好多书 一对多关系,哪个表数据多就把关键设置哪个表中 所以publisher=models.ForeignKey(to='Publish',to_field='id',on_delete=models.CA