ORM对字段的增删改查

# 建一个作者表
class Author(models.Model):
'''
如果你以后在创建表的时候,主键就叫id名,那么可以省略不写,orm会自动帮你创建出主键名称为id的字段
但是,如果你的主键名不叫id,比如叫cid,nid...那么,就不能省略了,就要全写。 所以,以后,我在创建表的时候,id我都不写了,默认使用id
'''
name = models.CharField(max_length=32)
phone = models.CharField(max_length=64)

数据的增删改查

 # ORM对数据的增删改查
# 增加
# 第一种方式,objects组件,封装了很多东西,我们不需要知道里面具体实现了什么 # res=models.Author.objects.create(name='ly1', phone=120)
# print(res) # Author object, 魔法 __str__ => 打印对象的时候自动触发
# print(res.name)
# print(res.phone) # 第二种方式:
# res = models.Author(name='ly111', phone=119) # 只是生成了对象
# res.save() # 才真正的操作数据库 # 查询
# sql: select * from author
# <QuerySet [<Author: ly>, <Author: ly1>, <Author: ly111>]> # 列表套对象
# res = models.Author.objects.all()
# print(res)
# obj = res[0]
# print(obj.phone)
# for obj in res:
# print(obj.name)
models.Author.object.filter(username=u)
# 查询手机号为120的
# sql: select * from author where phone=120
# filter => where
# res = models.Author.objects.filter(phone=120).all()
# print(res) # <QuerySet [<Author: Author object>]>
# print(res[0].phone) # <QuerySet [<Author: Author object>]> # 查询手机号是119的,并且name=ly111的
# sql:select * from author where phone=119 and name='ly111'
'''filter里面的以逗号隔开是and关系'''
'''多个filter之间的关系也是and关系'''
# res = models.Author.objects.filter(name='ly111', phone=119).all()
# <QuerySet [<Author: Author object>]>
'''只要返回的结果是queryset对象,那么,就可以一直点queryset提供的方法'''
'''目前,操作的都是单表,多表以及跨表下节课说'''
# res = models.Author.objects.filter(name='ly111').filter(phone=119).all()
# res = models.Author.objects.filter(name='ly111').filter(phone=119)
# res = models.Author.objects.first() # 第一条
# res = models.Author.objects.last() # 最后一条
'''我想查询所有记录里面的第一条数据'''
# print(res[0])
# print(res) # 改
# 把id=1的数据的phone改为123
# sql: update author set phone = 123456 where id=1
# orm:
# 修改的语句,返回结果是影响的行数
# res = models.Author.objects.filter(id=1).update(phone=123456) # 1
# res = models.Author.objects.update(phone=123456) # 3
# print(res) # 第二种方式
# res = models.Author.objects.filter(id=1).first()
'''pk意思是按照表的主键查询,pk:primary key, 如果你的主键字段叫cid, nid,...'''
# res = models.Author.objects.filter(pk=1).first()
# # res.phone # 获取
# res.phone = '123' # 获取
# res.name = 'hahahhah' # 获取
# res.save() # 删除
# 删除id=1的数据
# sql: delete from author where id=1
# orm:
# res = models.Author.objects.filter(pk=1).delete()
res = models.Author.objects.delete()
print(res) # (1, {'app01.Author': 1}) # 影响的行数

模板页面传值

# 补充一个知识
def ab_render(request):
username = '大宝贝hahahahhhah'
password = '1234454545'
age = 18
# 第一种传参方式
# return render(request, 'ab_render.html', {'username':username, 'password':password})
# 第二种传参方式
# {'username': '大宝贝hahahahhhah', 'request': <WSGIRequest: GET '/ab_render/'>}
# print(locals()) # 局部名称空间
# print(globals()) # 局部名称空间
return render(request, 'ab_render.html', locals())

使用ORM创建外键关系

1. mysql的三种关系
一对一
一对多
多对多
2. 以四张表为例
2.1 图书表
2.2 出版社表
2.3 作者表
2.4 作者详情表 3. 四张表之间的三种关系
'''
一对一:作者表和作者详情表
外键字段建在查询较多的一张表
一对多:图书表和出版社表
外键字段建在多的一方
多对多:图书表和作者表
外键字段不建在任何一张表中,而是创建出第三张表 '''
4. ORM创建出来三种关系
5. 在django1.x中,级联更新和级联删除是默认的
6. 在django2.x中,级联更新和级联删除是需要手动指定的

创建外键关系表

from django.db import models

# Create your models here.

'''创建外键关系'''

'''创建外键关系表的时候,先创建基础字段,先不要管外键字段'''

# 1. 图书表
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name='图书标题')
# price int
# price = models.IntegerField() # 创建出来int类型
# price decimal(8, 2)
'''
max_digits=None, 代表存储的总长度
decimal_places=None, 代表的是存储的小数位
'''
price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格') # 可以存小数 # 创建和出版社的外键关系, 一对多
'''如果关联的字段是主键,那么to_field可以省略不写,默认关联的就是主键 另外,如果你关联的不是主键字段,那么这个参数就不能省略,必须显式指定
'''
# publish_id = models.ForeignKey(to='Publish', to_field='id')
# publish_id = models.ForeignKey(to='Publish')
'''
当我们创建一对多关系的时候,字段的后缀_id就不要在自己添加了
而是,自动帮我们添加_id字段
'''
# publish_id = models.ForeignKey(to='Publish')
publish = models.ForeignKey(to='Publish') # 建立与作者表的多对多关系
'''
authors是一个虚拟字段,不会在Book表中创建出来authors字段,而是,会自定帮助我们创建出来第三张表
此时的第三张表就是图书与作者之间的关系表
'''
authors = models.ManyToManyField(to='Author', ) # 2. 出版社表
class Publish(models.Model):
'''
verbose_name:对当前字段进行解释,每个数据类型都有这个参数
'''
title = models.CharField(max_length=64, verbose_name='出版社标题')
addr = models.CharField(max_length=32) # 3. 作者表
class Author(models.Model):
name = models.CharField(max_length=32) # 与作者详情表建立一对一外键关系
'''
当我们创建一对一关系的时候,字段的后缀id就不要在加了,而是默认添加_id的结尾
'''
author_detail = models.OneToOneField(to='AuthorDetail') # 4. 作者详情表
class AuthorDetail(models.Model):
phone = models.CharField(max_length=64)
wx = models.CharField(max_length=32)

django2.x中on_delete属性

关于别的属性的介绍

CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了

django orm的增删改查 以及django1.x和2.x的区别的更多相关文章

  1. Django ORM 数据库增删改查

    Django ORM 数据库增删改查 增 # 创建.增加数据(推荐) models.UserInfo.objects.create(username=') # 创建.增加数据 dic = {'} mo ...

  2. Python Django ORM基本增删改查

    工程下的urls.py中增加如下: from cmdb import views as cmdb #要把你要操作的项目import进来 urlpatterns = [ url(r'orm', cmdb ...

  3. ORM数据增删改查 django请求生命周期 django路由层 反向解析

    目录 可视化界面之数据增删改查 补充 1.建表 2.数据展示功能 3.数据添加功能 4.数据编辑功能 5.数据删除功能 django请求生命周期流程图 crsf wsgirel 与 uwsgi ngi ...

  4. Python学习---django之ORM的增删改查180125

    模型常用的字段类型参数 <1> CharField        #字符串字段, 用于较短的字符串.        #CharField 要求必须有一个参数 maxlength, 用于从数 ...

  5. Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)

    摘要: Django项目简单现实过程 pycharm连接数据库 Django之orm简单操作增删改查 一.新建Django项目.配置.设置: 新建Django项目:(为了熟悉Django操作,暂时全部 ...

  6. ORM基本增删改查

    将上一节建造好的数据库 引入Navicate copy_path找到数据表路径 再用navicat打开 创建好的db不只一张表,其中第一张是我们创建的可以用的表  ,其他都是django自带功能所需表 ...

  7. Django之数据增删改查、Django请求生命周期流程图、Django路由层(路由匹配、转换器、正则匹配)、反向解析

    今日内容详细 可视化界面之数据增删改查 针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取 在模型类中定义__str__方法可以在数据对象被执行打印操作的时候方便查看 ''' form扁担 ...

  8. 12月12日内容总结——Django之数据增删改查、Django请求生命周期流程图、Django路由层(路由匹配、转换器、正则匹配)、反向解析

    目录 一.可视化界面之数据增删改查 二.django请求生命周期流程图 三.django路由层 1.路由匹配 2.转换器 3.正则匹配 不同版本的区别 正则匹配斜杠导致的区别 4.正则匹配的无名有名分 ...

  9. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  10. laravel orm进行增删改查

    https://laravelacademy.org/post/9699.html 建议用DB门面直接操作数据库,因为ORM性能低.数据查询上面,ORM不会比DB差的,就比如with,是用了sql最基 ...

随机推荐

  1. 【C++复习】5.7 多文件结构与编译预处理命令

    1.C++项目结构 C++程序的一般组织架构 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main()所在的.cpp文件) 用工程组合各文件 2.编译链接 编译链接过程 3.外部 ...

  2. python学习之路---基础概念扩展:变量,表达式,算法,语句,函数,模块,字符串

    对于学过一点编程语言的人,学习python基础知识不难,基本大同小异 本章是根据一本书来学习python的编程(强烈推荐)来记录学习python中的有意思的总结 Python 基础教程(第三版)    ...

  3. 87、linux root 密码忘记了

    子账户登录,然后重置即可

  4. 使用vue的插槽理解

    使用插槽的时候其实就是引用子组件,在引用的组件中间写上你要的代码,然后在子组件的的<slot ></slot>中就包含父组件写下的代码. 父组件 import addshop ...

  5. 拉取docker容器后启动容器的脚本

    我暂且不论如何拉取docker镜像.我使用sudo docker images查看拉取的镜像. 譬如我拉取nvidia的pytorch镜像后,想要创建一个实例或启动某实例,可使用如下脚本(如果本地没有 ...

  6. C#中Newtonsoft.Json.dll 的使用

    1.类库说明Newtonsoft.Json.dll是.NET 下开源的json格式序列号和反序列化的类库,利用此类库,可以方便地操作json数据,其中在反序列化时,可以直接将格式化的json数据处理成 ...

  7. Hashtable多线程遍历问题

    If a thread-safe implementation is not needed, it is recommended to use HashMap in place of code Has ...

  8. pg copy用法

    postgresql copy用法1,导出表数据1)导出test表数据到txt copy test to '/home/jinli/test.txt'; 2)导出test表数据到csv copy te ...

  9. 数据库tempdb的事物日志已满,原因为“ACTIVE_TRANSACTION”

    系统运行过程中,突然报错数据库tempdb的事物日志已满,原因为"ACTIVE_TRANSACTION".导致所有业务崩溃. 接到报警后,进入数据库服务器.检查硬盘空间正常,于是登 ...

  10. 如何在matlab中快速绘制一个函数的图像

    在malab绘制曲线图,并在x,y轴上加上说明 直接贴代码 clear,clck=1:1:10;y1=pi./atan(sqrt(k))-1;plot(k,y1)xlabel('Rz');ylabel ...