django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】


Posted in Python onDecember 12, 2019

本文实例讲述了django框架使用views.py函数对表进行增删改查内容操作。分享给大家供大家参考,具体如下:

models之对于表的创建有以下几种:

一对一:ForeignKey("Author",unique=True),  OneToOneField("Author")

一对多:ForeignKey(to="Publish",to_field="id",on_delete.CASCADE)

多对多:ManyToManyField(to="Author")

首先我们来创建几张表

from django.db import models
# Create your models here.
class AuthorDetail(models.Model):
  gf=models.CharField(max_length=32)
  tel=models.CharField(max_length=32)
class Author(models.Model):
  name=models.CharField(max_length=32)
  age=models.IntegerField()
  # 与AuthorDetail建立一对一的关系
  # ad=models.ForeignKey(to="AuthorDetail",to_field="id",on_delete=models.CASCADE,unique=True)
  ad=models.OneToOneField(to="AuthorDetail",to_field="id",on_delete=models.CASCADE,)
class Publish(models.Model):
  name=models.CharField(max_length=32)
  email=models.CharField(max_length=32)
  addr=models.CharField(max_length=32)
class Book(models.Model):
  title=models.CharField(max_length=32,unique=True)
  price=models.DecimalField(max_digits=8,decimal_places=2,null=True)
  pub_date=models.DateField()
  # 与Publish建立一对多的关系,外键字段建立在多的一方
  publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)
  # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建关系表book_authors
  authors=models.ManyToManyField(to="Author")

说明:

OneToOneField 表示创建一对一关系。

to 表示需要和哪张表创建关系

to_field 表示关联字段

on_delete=models.CASCADE 表示级联删除。假设a表删除了一条记录,b表也还会删除对应的记录。

ad表示关联字段,但是ORM创建表的时候,会自动添加_id后缀。那么关联字段为ad_id

注意:创建一对一关系,会将关联字添加唯一属性。比如:ad_id

ForeignKey 表示建立外键

on_delete=models.CASCADE 表示级联删除。使用ForeignKey必须要加on_delete。否则报错。这是2.x规定的

ManyToManyField 表示建立多对多的关系。它只需要一个to参数,表示和哪张表创建多对多关系!

这里是在book模型下定义了多对多关系,它会自动创建一张额外的关系表。表的名字就是当前模型的名字(book)+关系的属性名(等式左边的属性名authors)。

也就是会创建表book_authors,它只有3个字段,分别是:本身表的id,boo表主键id,authors表主键id。

 下面在视图 views.py里面使用

from django.shortcuts import render,HttpResponse
from app01.models import AuthorDetail,Author,Publish,Book
# Create your views here.
def add(request):
  # 注意:因为author的ad属性是关联authordetail表,必须添加authordetail表,才能添加author表。
  # hong_gf=AuthorDetail.objects.create(gf='小唐',tel=1314)
  # hong=Author.objects.create(name='hong',age='25',ad=hong_gf)
  # print(hong)
  # # publish_id就是Book类的publish属性。它的字段为publish_id
  # book = Book.objects.create(title='西游记', price=100, pub_date="1743-4-12", publish_id=2)
  # print(book.title) # 打印title
  # return HttpResponse('添加成功')
  # xigua = Publish.objects.filter(name="西瓜出版社").first() #model对象
  # book = Book.objects.create(title='三国演义',price=300,pub_date="1643-4-12",publish=xigua)
  # return HttpResponse('添加成功')

下面是对应两个其他表的字段

# book = Book.objects.create(title='python',price=122,pub_date="2012-12-12",publish_id=1)
  # xiao = Author.objects.filter(name="xiao").first() #取Author表name为xiao的id
  # zhang = Author.objects.filter(name="zhang").first()
  # print(zhang)
  # book.authors.add(xiao,zhang) # 添加2条数据,接收一个参数,就会产生一条记录
  #
  # return HttpResponse('添加成功')

下面是对应author表的所有作者

# book = Book.objects.create(title='linux', price=155, pub_date="2013-12-12", publish_id=2)
  # author_list=Author.objects.all()
  # book.authors.add(*author_list)
  # return HttpResponse('添加成功')

  #解除绑定关系
  # book = Book.objects.filter(id=3).first() # 先找到这本书
  # xiao = Author.objects.filter(name="xiao").first() # 再找到作者
  # book.authors.remove(xiao) # 解除绑定的关系
  # return HttpResponse('解除绑定成功')

  #清空所有关系对象
  # book = Book.objects.filter(id=4).first()
  # book.authors.clear() # 清理所有关系对象
  # return HttpResponse('清理成功')

  #绑定唯一的作者或者几个作者,放入一个列表中
  book=Book.objects.filter(id=3).first()
  wang=Author.objects.filter(name='wang').first()
  book.authors.set([wang]) #先清空再设置
  return HttpResponse('绑定唯一作者成功')

总结:

重点掌握create,add,remove,clear,set这五个方法!

添加表记录:

一对一和一对多,使用create方法。它有2种使用方法:

1. create(字段名1=值1...)。适用于表单添加操作!注意,这里面的字段名是ORM创建表之后的的字段名

比如: book类的publish属性,它是关联字段,ORM创建之后,字段名为publish_id

2.create(模型类属性1=值1...)。比如book类的publish属性,它是关联字段。

直接create(publish=obj1),注意,它接收一个model对象,对象包含了主键id

多对多使用add方法。add用2种使用方法:

1.add(obj1,obj2...) 它接收一个model对象,对象包含了主键id

2.add(主键id1,主键id2...) 它接收一个主键id。适用于表单添加操作!

还有一个python的打散语法,前面加一个*就可以了。比如*[1,2],它会依次调用前置方法,每次只取一个值。表单操作,会用到!

 删除记录:

适用于一对一,一对多,多对一。

remove(obj1, obj2, ...) 去除多个关系对象。它需要指定一个或者多个对象

clear() 清理所有关系对象。不管现有的关系有多少,一律清空!

set([obj1,obj2...]) 先清空再设置。不管现有的关系有多少,一律清空再设置。适用于网页后台修改操作

 查询 ---》基于对象的跨表查询(子查询)

一对多查询

book_authors表的内容

django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】

一般写法:

def add(request):
  book = Book.objects.filter(title="西游记").first() #过滤出记录
  publish_id = book.publish_id #找出书籍对应的出版社id
  publish = Publish.objects.filter(id=publish_id).first() #根据id号在 Publish表中找出出版社名称
  print(publish.name)

简单写法

def add(request):
book = Book.objects.filter(title="西游记").first() #找出Book表中title为 西游记的 记录

print(book.publish.name) #书籍.出版社.名称

正向和反向查询

正向和反向,就看关键字段在哪里?

如果是通过关联字段查询,就是正向。否则是反向!

简单来说:正向,按照字段。

反向,按照表名小写_set() 例如:publish.book_set()  --->适用于一对多,多对多

 记录只有一条 通过 字段.名称               -----》一对一

例子:找出西瓜出版社出版的所有书籍名称(一对多查询)

正向查询

def add(request):
  publish = Publish.objects.filter(name="西瓜出版社").first() # 先找出版社
  ret = Book.objects.filter(publish_id=publish.id).values("title") # 再找书籍
  print(ret)
return HttpResponse('ok')

反向查询

def add(request):
  publish = Publish.objects.filter(name="西瓜出版社").first() # 先找出版社
  ret = publish.book_set.all().values("title") # 再找书籍,过滤title
  print(ret)
  return HttpResponse('ok')

 例子:(多对多)

正向查询 查询python这本书籍的所有作者的姓名和年龄

def add(request):
  book = Book.objects.filter(title="python").first() # 先找书籍
  ret = book.authors.all().values("name","age") # 再找作者,过滤name和age
  print(ret)
  return HttpResponse('ok')

反向查询:查询作者xiao出版过的所有书籍名称

def add(request):
  xiao = Author.objects.filter(name="xiao").first() # 先找作者
  ret = xiao.book_set.all().values("title") # 再找书籍,过滤title
  print(ret)
  return HttpResponse('ok')

django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】

例子:一对一

正向查询:查询xiao的女朋友的名字--》gf

def add(request):
  xiao = Author.objects.filter(name="xiao").first() # 先找作者
  ret = xiao.ad.gf # 再找女朋友
  print(ret)
  return HttpResponse('ok')

反向查询:查询手机号为112的作者名字

def add(request):
  phone = AuthorDetail.objects.filter(tel="112").first() # 先找号码
  ret = phone.author.name # 再找作者的名字
  print(ret)

django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python实现的圆形绘制(画圆)示例
Jan 31 Python
python 实现登录网页的操作方法
May 11 Python
Django 表单模型选择框如何使用分组
May 16 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
Django实现文件上传下载功能
Oct 06 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
Jan 13 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
python与js主要区别点总结
Sep 13 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python多次执行绘制条形图
Apr 20 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 #Python
python 使用opencv 把视频分割成图片示例
Dec 12 #Python
Python2与Python3的区别点整理
Dec 12 #Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 #Python
opencv3/C++实现视频读取、视频写入
Dec 11 #Python
django框架两个使用模板实例
Dec 11 #Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 #Python
You might like
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
探索node之事件循环的实现
2020/10/30 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
详解Python中的元组与逻辑运算符
2015/10/13 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
python爬虫基础知识点整理
2020/06/02 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
奥巴马开学演讲稿
2014/05/15 职场文书
承诺书范本
2015/01/21 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
投资入股协议书
2016/03/22 职场文书
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
Python PIL按比例裁剪图片
2022/05/11 Python
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android