-ORM

ORM是什么?

不是django独有或者python独有的

对象关系映射

python中主流的几个ORM框架

django的orm(django已经封装好了,必须在django中使用)

sqlAchemy 第三方的orm框架(这个可以单独拿出来使用)---Flask框架并没有orm,会用到sqlAchemy

自己写

orm不能创建数据库,只能创建表,删除表,新增字段,删除字段

通过orm创建user表

第一步 在settings.py配置

DATABASES={'ENGINE':'django.db.backends.mysql','NAME':'数据库名字','HOST':'mysql IP','PORT':3306,'USER':'数据库用户名','PASSWORD':'数据库密码'}

第二步 链接数据库,操作数据库的模块(pymysql)- mysqlDB 只能python 2.x用(django内置这个模块)-pymysql python2.x 和3.x 都可以用-所以需要在__init__.py下写一行代码(一般情况 写在app下面的__init__中)importpymysql#让pymysql替换掉原来django中内置的mysqldb的地方,以后操作mysql,就用pymysql这个模块

pymysql.install_as_MySQLdb()

第三步 创建一个表(在models.py中创建新表)#创建一个user表,在orm中,其实就是写一个类

classUser(models.Model):#在这个类中,写入需要创建的字段

#id字段,自增,int类型,是主键

id = models.AutoField(primary_key=True)#name字段,varchar类型 ,长度32

name = models.CharField(max_length=32)#pwd字段,varchar类型 ,长度32,可以为空

pwd = models.CharField(max_length=32, null=True)

第四步:

把新建表同步到数据库,django项目中的migrations文件夹存放数据库迁移的记录

按次序执行下面两条指令:

python3 manage.py makemigrations#数据表变化的记录

python3 manage.py migrate #数据库同步命令(数据库的表就会发生变化)

-通过orm创建user表

通过上面的四个步骤,就可以创建出user表

新增表、删除表、新增字段、删除字段--- 一个class就是一张表,删除=注释代码+执行两条命令,新增=新增字段代码+执行两条命令classUser(models.Model):#在这个类中,写入需要创建的字段

#id字段,自增,int类型,是主键

id = models.AutoField(primary_key=True)#name字段,varchar类型 ,长度32

name = models.CharField(max_length=32)#pwd字段,varchar类型 ,长度32,可以为空

pwd = models.CharField(max_length=32, null=True)#增加字段

xx = models.CharField(max_length=64)## 再增加个字段

#yy = models.CharField(max_length=64, null=True)

# ## 再增加一个字段

#zz = models.CharField(max_length=64, null=True, default='www')

# ## 删除字段(只要注释掉 然后两条命令同步下就好了)

方式一:

在termimal中执行 python3 manage.py makemigrations

python3 manage.py migrate

方式二:

pycharm-tools-‘run manage.py Task..'-在命令输入框中输入migrations-在命令输入框中输入migrate

1单表的增删改查#为了验证测试方便,写了这个脚本 用来验证orm 数据增删改查

importosif __name__ == '__main__':

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ORM_Proj.settings')importdjango

django.setup()from app01 importmodels

(紧接着 上面的脚本写下去)#新增用户

#方式一,通过对象来保存数据

#user = models.User(username=name, passwd=pwd)

#user.save()

#return HttpResponse('新增成功')

#方式二 表模型 (常用方式)

#user = models.User.objects.create(username=name,passwd=pwd)

#print(user.username)

# #return HttpResponse('create successful')

#查询id=1的用户

#ret = models.User.objects.filter(id=1) #结果是queryset对象,内部套了一个个的对象(理解为是一个列表)

#查询名字为lich的数据

#ret = models.User.objects.filter(username='lich').first() #结果是User对象,取出查询结果中的第一条数据

#ret = models.User.objects.filter(username='lich')

#print(ret)

#删除的第一种方式: 把id=1的人删除(先查询后删除)

#ret = models.User.objects.filter(id=1).delete() #把查询出来的所有结果删除

#print(ret)

#删除的第二种方式:删除id=6的这个人(查询出对象,删除对象)

#ret = models.User.objects.filter(id=6).first()

#print(ret.username)

#print(ret.passwd)

#ret.delete()

#修改数据的第一种方式: 修改id=5 的人的name为xxx

#ret = models.User.objects.filter(id=5).update(username = 'xxx') #所有查询出来的数据都更新

#print(ret) #ret是影响的行数

#修改数据的第二种方式:

user = models.User.objects.filter(id=5).first()

user.username= 'xxx'

#没有user.update()

user.save() #既可以保存 又可以更新

print(user.username)2单表的其他操作### 单表的其他操作

#<1> all()返回queryset对象,查询表中所有记录

#ret = models.User.objects.all() #把它当成queryset对象

#print(ret)

#<2> filter(**kwargs)返回queryset对象, 这种形式是'id=3 pwd=333' 是and条件

#ret = models.User.objects.filter(id=5,passwd='333')

#ret = models.User.objects.filter(id=5,passwd='123') #和下面的一样一样的

#ret = models.User.objects.filter(**{'id':5,'passwd':'123'})

#print(ret)

#get(**kwargs)的返回值是User对象

#get查询的结果有且只有一个值才行,否则程序会报错

#user = models.User.objects.get(id=5)

#print(type(user))

#exclude(**kwargs)除了条件的记录以外的

#ret = models.User.objects.exclude(id=3)

#print(ret)

#order_by

#ret = models.User.objects.all().order_by('username') # 查询出所有记录,升序排列

#ret = models.User.objects.all().order_by('-username') # 查询出所有记录,降序排列

#print(ret.query) #打印原生sql

#print(ret)

#reverse() 必须用在order_by之后

#ret = models.User.objects.all().order_by('passwd')

#ret = models.User.objects.all().order_by('passwd').reverse()

#print(ret)

#count()计算查询结果的总条目数

#ret = models.User.objects.all().count()

#ret = models.User.objects.filter(username='a').first()

#print(ret)

#exists()查询queryset对象的结果是否为空,返回的结果是true或false

#ret = models.User.objects.filter(id=10).exists()

#ret = models.User.objects.filter(id=8).exists()

#print(ret)

#values() 返回一个valueQueryset,运行后得到一个可迭代的字典序列

#ret = models.User.objects.all().values('username','passwd')

#print(ret)

#print(ret.first())

#values_list() 直接将取到的结果 组成一个元组

#ret = models.User.objects.all().values_list('username','passwd')

#print(ret)

#distinct 记录去重

#ret = models.User.objects.filter(username='lich')

#ret = models.User.objects.filter(username='lich').values('username').distinct()

#print(ret)

### 模糊查询 使用__ 双下划线(基于__的模糊查询)

#in 查询id=1-7之中,的所有记录

#ret = models.User.objects.filter(id__in=[1,2,3,4,5,6,7])

#print(ret)

#print(ret.query)

#range between...and...

#ret = models.User.objects.filter(id__range=[1,7])

#print(ret)

#print(ret.query)

#大于,小于,大于等于,小于等于

#ret = models.User.objects.filter(id__gt=9) #大于

#ret = models.User.objects.filter(id__gte=9) #大于等于

#ret = models.User.objects.filter(id__lt=7) #小于

#ret = models.User.objects.filter(id__lte=7) #小于等于

#print(ret)

#startswith 以xx开头

#ret = models.User.objects.filter(username__startswith='l')

#print(ret)

#contains 包含xx

ret = models.User.objects.filter(username__contains='i') #严格大小写包含

ret = models.User.objects.filter(username__icontains='i') #忽略大小写包含

print(ret)3表操作(增删改)-一对一#一对一新增(注意所在database的字符集)

#第一种方式:先新增author_detail

#author_detail = models.AuthorDetail.objects.create(addr='南京',phone='132111')

#author = models.Author.objects.create(name='lich',age=19,author_detail_id=author_detail.id)

#author_detail.pk 是主键

#author = models.Author.objects.create(name='lich',age=19,author_detail_id=author_detail.pk)

#第二种方式:author_detail = 对象

#author_detail = models.AuthorDetail.objects.create(addr='东京',phone='142111')

#author = models.Author.objects.create(name='lqz',age=20,author_detail=author_detail)

#修改

#修改-第一种方式

#author = models.Author.objects.filter(pk=1).update(author_detail_id = 3)

#修改-第二种方式

#author_detail = models.Author.objects.get(pk=3)

#author = models.Author.objects.filter(pk=1).update(author_detail = author_detail)

-一对多#一对多的新增

#publish = models.Publish.objects.create(name='南京出版社',email='sddd',phone=3333,addr='南京')

#book = models.Book.objects.create(name='红楼梦',publish_date='2018-01-01',price=100.33,publish_id=publish.pk)

-多对多#增加(给红楼梦这本书 添加两个作者:lich lqz)

#book = models.Book.objects.filter(name='红楼梦').first()

#相当于拿到第三张表,add内可以传入对象,也可以传id

#book.authors.add(1,3) #传id

#lich = models.Author.objects.get(pk=1)

#lqz = models.Author.objects.get(pk=3)

#book.authors.add(lich,lqz) #传对象

4 表操作(查)---基于对象的跨表查询:基于对象的查询其实是子查询(两次查询)#正向和反向

#正向: 关联字段在当前表中,从当前表向外查,叫做正向

#反向: 关联字段不在当前表中,从当前表向外查,叫做反向

#一对一查询 ()

#查询lich这个人的地址(正向查询按字段,反向查询表名小写)

#author = models.Author.objects.filter(name='lich').first() # 先查找出这个对象

#print(author.author_detail) #需要在models类中,重写__str__(self)

#查询地址为南京的作者人名(反向)

#author_detail = models.AuthorDetail.objects.filter(addr='南京').first()

#print(author_detail.author)

#一对多(正向) 出版社和书 关联字段在书中

#正向查询按字段,反向查询按 表名小写_set.all()

#书~出版社:正向

#查询红楼梦这本书的出版社地址

#book = models.Book.objects.filter(name='红楼梦').first()

#book.publish 就是出版社对象

#print(book.publish)

#print(book.publish.addr)

#出版社~书:反向

#查询南京出版社出版的所有书的名字

#publish = models.Publish.objects.filter(name='南京出版社').first()

#books = publish.book_set.all()

#print(books)

#for book in books:

#print(book.name)

#多对多,书和作者是多对多,关联字段authors在book中

#总结:正向查询按字段.all() ,反向查询按 表明小写_set.all()

#正向:book~author

#查询红楼梦这本书的所有作者

#book = models.Book.objects.filter(name='红楼梦').first()

#authors = book.authors.all()

#print(authors)

#for author in authors:

#print(author.name)

#反向:author~book

#查询作者是bbb的所有书

#author = models.Author.objects.filter(name='bbb').first()

#books = author.book_set.all()

#print(books)

#for book in books:

#print(book.name)

5 表操作(查)---基于双下划线的跨表查询(连表查询)#正向按 '基表关联字段__第二张表的字段',反向按 '基表表名小写__第二张表的字段'

#一对一查询

#查询lich这个人的地址(以author表作为基表)

#ret = models.Author.objects.filter(name='lich').values('name','author_detail__addr')

#print(ret)

#查询lich这个人的地址(以author_detail表作为基表)

#ret = models.AuthorDetail.objects.filter(author__name='lich').values('addr','author__name')

#print(ret)

#查询地址为上海的人的名字

#ret = models.Author.objects.filter(author_detail__addr='上海').values('name','author_detail__addr')

#print(ret)

#ret = models.AuthorDetail.objects.filter(addr='上海').values('author__name','addr')

#print(ret)

#一对多查询

#查询红楼梦这本书的出版社

#ret = models.Book.objects.filter(name='红楼梦').values('publish__addr')

#print(ret.first())

#ret = models.Publish.objects.filter(name='南京出版社').values('addr','book__name')

#print(ret)

#查询南京出版社出版所有书的名字

#ret = models.Publish.objects.filter(name='南京出版社').values('book__name')

#print(ret)

#ret = models.Book.objects.filter(publish__name='南京出版社').values('name')

#print(ret)

#多对多

#查询红楼梦这本书的所有作者

#ret = models.Book.objects.filter(name='红楼梦').values('authors__name')

#print(ret)

#ret = models.Author.objects.filter(book__name='红楼梦').values('name')

#print(ret)

#查询南京出版社出版过的所有书记的名字以及作者的姓名

#ret = models.Publish.objects.filter(name='南京出版社').values('book__name','book__authors__name')

#print(ret)

6 表操作(查) ---聚合查询#计算所有图书的平均价格

#from django.db.models import Count,Avg,Max,Min,Sum

#ret = models.Book.objects.all().aggregate(Avg('price')) #平均价格

#ret = models.Book.objects.all().aggregate(Max('price')) #最高价格...

#ret = models.Book.objects.all().aggregate(Count('price')) #书本数量

#ret = models.Book.objects.all().aggregate(Sum('price')) #书本数量

#print(ret)

7 表操作(查)--- F/Q查询#F取出表中字段对应的值

#查询评论数大于阅读数的书

from django.db.models importFfrom django.db.models importQ#ret = models.Book.objects.filter(comment_num__gt=F('read_num'))

#ret = models.Book.objects.filter(comment_num__lt=F('read_num'))

#print(ret)

#把所有书的评论数+1

#ret = models.Book.objects.all().update(comment_num = F('comment_num')+1)

#Q查询,构造出 与(&) 、 或(|) 、 非(~)的关系

#ret = models.Book.objects.filter(name='红楼梦',price=100)

#print(ret)

#ret = models.Book.objects.filter(Q(name='西游记')|Q(price='12.11')) # 或 有点疑问

#ret = models.Book.objects.filter(Q(name='红楼梦')&Q(price=100)) #不如,并且关系来的简单 #与 有点问题

#ret = models.Book.objects.filter(~Q(name='西游记')) # 非

#print(ret)

-图书管理系统表1book表2publish表3author表4author_detail表

表关系-author表和author_detail表是一对一的关系-book表和publish表:一本书只能有一个出版社出版,一对多的关系一旦确立,关联字段写在多的一方-book表和author表:多对多的关系,需要创建第三张表**** 关联关系 ****:

一对一的关系,关联字段写在哪都行

一对多的关系,关联字段写在多的一方

多对多的关系,需要创建第三张表

重点:1 author_detail = models.OneToOneField(to='AuthorDetail',to_field='id') #本质就是foregnkey+唯一性约束

2 publish = models.ForeignKey(to='Publish') #ForeignKey对应的字段,同步到数据库,会自动加_id

3 authors = models.ManyToManyField(to='Author') #自动创建第三张表

python框架django入门_web框架之Django(python3入门)相关推荐

  1. Python3入门之软件安装

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 最近将我的Python笔记整理下,希望能对他人有所帮助,这是第一课,安装入门篇: windows下安装Python 1.下载,从这里下载:[下载链 ...

  2. python3入门之集合set

    之前介绍python的数据结构时,没有介绍set(集合)现在在这里稍微介绍下: set原理 Python 还 包 含 了 一 个 数 据 类 型-- set ( 集 合 ) . 集 合 是 一 个 无 ...

  3. python3入门之赋值语句介绍

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍赋值语句,以及几种特殊的赋值.下面附有之前的文章: 简要介绍下赋值语句 在 python 中赋值语句总是建立对象的引用值,而不是复制对 ...

  4. python3入门之几个函数变化

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍print,import和input,t函数,包括他们在python2.7和python3 的区别以及用法.下面附有之前的文章: py ...

  5. Python实现简单的淘宝网——Django框架

    项目演示: Django实现简易淘宝网站 一.安装Django 在之前的博客中有相关文章,介绍了Django项目的搭建,今天在这里来给大家分享一下,之前课程设计做的一个由Django实现的简单淘宝网站 ...

  6. python django框架如何导出_python框架django的数据库的正向生成和反向生成

    正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model.py的表. 反向生成,指的是先在数据库中create table,然后通过dj ...

  7. python框架django文档_Django基础——Django框架介绍及模板语言

    Django框架,我们只需要关心二点: 1.根据用户访问不同的路径执行不同的函数 2.从HTML读取出内容,并且完成字符串的替换 而socket通信不需要我们自己写: 新建Django项目 命令行创建 ...

  8. python flask和django_真正搞明白Python中Django和Flask框架的区别

    在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...

  9. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

最新文章

  1. ST-GCN 实现人体姿态行为分类
  2. [汇编与C语言关系]2. main函数与启动例程
  3. MySQL中group_concat()函数用法总结
  4. MySQL修改数据类型语句
  5. Linux网络编程---详解TCP
  6. martingale与Markov Process的关系
  7. Groovy的基础语法
  8. 【Linux】Linux用户和权限管理
  9. 上海新中考体育考试方案公布:总分30分不变
  10. 【王道计组笔记】储存系统(1):基本概念
  11. 大数据智能运维平台方案-1
  12. 《SSCOM串口/网络数据调试器》
  13. 博士阶段能学到什么硕士学不到的东西
  14. DITHER抖动算法
  15. 使用JS打印网页内容及图片
  16. 大数据时代背景下的商标注册风险及应对方法
  17. 使用Apache搭建网站
  18. 深入理解Pytorch负对数似然函数(torch.nn.NLLLoss)和交叉熵损失函数(torch.nn.CrossEntropyLoss)
  19. 区块链-链上云计算应用技术沙龙
  20. MATLAB之最小二乘法

热门文章

  1. VS中调试时不能关联源代码问题
  2. Linux 磁盘管理 二(Raid、LVM、Quota)
  3. 你的行为合理吗?看看社会心理学给我们的启示。
  4. (七)全半角转换(转)
  5. php 利用fsockopen GET/POST 提交表单及上传文件
  6. maven工程下 读取resource下配置文件
  7. 专门用于微信公众平台的Javascript API
  8. NHibernate+MySql (erro 解决方法)
  9. PHP7 serialize_precision 配置不当导致 json_encode() 浮点小数溢出错误
  10. Linux实现后台运行程序及查看nohup jobs