第十九章 Django的ORM映射机制

第一课 Django获取多个数据以及文件上传
1.获取多选的结果(checkbox,select/option)时:
req.POST.getlist('favor')获取一个列表
2.上传文件:
前端html中:
<form action='/login' method='POST' enctype='multipart/form-data'>
后端接收:
if req.method=='POST':
obj = req.FILES.get('fffa') #用FILES.get取得文件对象
print(obj, type(obj),obj.name)
import os
file_path = os.path.join('uplode', obj.name)
f = open(file_path, 'wb')
for i in obj.chunks(): #获取文件对象内容
f.write(i)
f.close()
3.FBV和CBV:
FBV:function base views /index==>函数名
CBV:class base views /index==>类
CBV格式(固定写法,自动将post和get来的数据分开处理):
views中的代码:
from django.views import View
class Home(View):
def get(self,req):
....
return render(req,'home.html')
def post(self,req):
.....
return render(req, 'home.html', ...)
urls中的代码:
path('home',views.Home.as_view()),
4.装饰器 (欠着,等讲cookie和session时再讲)


第二课 Django的URL
1.Django基于正则表达式的URL
templates目录下新建index.html文件
代码:
...
{{ urlinfo }}
...
urls.py中加入路径:
from django.urls import path,re_path
urlpatterns = [
...
re_path('index/(\d+)/(\d+).html',views.index)
]
views.py中:
def index(req,*args,**kwargs):
print(args)
return render(req,'index.html',{'urlinfo':args})

2.Django路由的分发
1.新建项目 fenfa 新建两个app:app01和app02
2.在urls中
代码:
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
path('admin/', admin.site.urls),
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls')),
]
3.在app01路径下新建urls.py:
urls.py中代码:
from django.urls import path,include
from app01 import views
urlpatterns = [
path('login', views.login),
]
views中的代码:
from django.shortcuts import render,HttpResponse
# Create your views here.
def login(req):
return HttpResponse('app01')
4.在app02路径下新建urls.py:
urls.py中代码:
from django.urls import path,include
from app02 import views
urlpatterns = [
path('login', views.login),
]
views中的代码:
from django.shortcuts import render,HttpResponse
# Create your views here.
def login(req):
return HttpResponse('app02')
5.浏览器端访问:127.0.0.1:8000/app01/login
显示:app01
6.浏览器端访问:127.0.0.1:8000/app02/login
显示:app02

3.命名空间(欠着)
4.默认值(欠着)

第三课 ORM操作
1.类操作:
1.根据类自动创建数据库表
#app下的Model.py
代码:
from django.db import models
# Create your models here.
class Userinfo(models.Model):
#app02_Userinfo
#id列 自增 主键
#创建用户名列,字符串类型,长度
username=models.CharField(max_length=32)
password = models.CharField(max_length=64)
在settings里面:
INSTALLED_APPS = [
...
'app02'
]
在命令行下执行:
python manage.py makemigrations
python manage.py migrate



2.根据类对数据库表中的数据进行各种操作
1.给数据库表增添数据(增):
views.py中代码:
from app02 import models
def orm(req):
models.Userinfo.objects.create(username='root',password='123')
return HttpResponse('orm')
app02下urls中增加路径:path('orm', views.orm),
浏览器访问:http://127.0.0.1:8000/app02/orm 触发函数
数据库表Userinfo已经增加了一行数据
2.(查):
1.查询表格所有内容:
views.py中代码:
from app02 import models
def orm(req):
result=models.Userinfo.objects.all()
print(result)
#result=>QuerySet=>Django=>[]
#[obj(id,username,password),obj(id,username,password)...]
for i in result:
print(i.id,i.username,i.password)
return HttpResponse('orm')
输出:
<QuerySet [<Userinfo: Userinfo object (1)>, ...]>
1 root 123
2 root 123
3 alex 321
4 张三 123
2.按条件查找:
views中的代码:
from app02 import models
def orm(req):
result=models.Userinfo.objects.filter(username='root')
print(result)
for i in result:
print(i.id,i.username,i.password)
return HttpResponse('orm')
输出:
<QuerySet [<Userinfo: Userinfo object (1)>,...>
1 root 123
2 root 123
3.(删):
models.Userinfo.objects.filter(id=2).delete()#按条件删
models.Userinfo.objects.all().delete() #清空整个表内容
4.更新(改):
1.models.Userinfo.objects.filter(id=3).update(password='666')
2.obj=models.Userinfo.objects.filter(id=3).first()
obj.caption='CEO'
obj.save()
3.创建表时,自己指定自增列:
models.py下:
class Group(models.Model):
uid=models.AutoField(primary_key=True)
username=models.CharField(max_length=64)
在命令行下执行:
python manage.py makemigrations
python manage.py migrate
2.字段和字段参数:
1.字段:
models.AutoField(primary_key=True) #自增列且必须设为主键
models.CharField(max_length=32) #字符串字段,必须有max_length参数
models.DateField(auto_now=True)#每次更新都会更新这个时间。
models.DateField(auto_now_add=True)#只是第一次创建时添加,之后不改变。
models.DateTimeField(auto_now=True)#每次更新都会更新这个时间。
models.DateTimeField(auto_now_add=True)#只是第一次创建时添加,之后不改变。

Django admin:
models.EmailField('正则表达式邮箱格式')
models.GenericIPAddressField(protocol='both') 可选protocol:'both''ipv4''ipv6'
models.URLField('正则表达式')
2.字段参数:
null --->db是否可以为空
default --->默认值
primary_key --->主键
db_colum --->列名
db_index --->索引:True False
unique --->唯一索引
unique_for_date -->只对时间做索引
unique_for_month -->只对月份做索引
unique_for_year -->只对年做索引
auto_now -->更新时间
auto_now_add -->创建时间
注意:
更新时间只对更新数据时使用.save()实例的更新方式有效:
obj=models.Userinfo.objects.filter(id=3).first()
obj.caption='CEO'
obj.save()
对:直接使用 update(password='666')的更新方式无效。
django admin:
choice ->django admin中显示下拉框,避免连表查询
blank ->django admin中是否可以为空
verbose_name ->django admin中显示字段中文
editable ->django admin中是否可编辑
error_messages
help_text ->django admin中提示信息
validators ->django form 自定义错误信息正则
3.外键(一对多)
主键表代码:
class Group(models.Model):
uid=models.AutoField(primary_key=True)#主键
username=models.CharField(max_length=64)
caption=models.CharField(max_length=64,default='') #定义一个default不然会报错
ctime=models.DateTimeField(auto_now_add=True,null=True)
utime=models.DateTimeField(auto_now=True,null=True)
参考表代码:
class Userinfo(models.Model):
username=models.CharField(max_length=32)
password = models.CharField(max_length=64)
user_group=models.ForeignKey接下一行
('Group',to_field='uid',blank=True,null=True,on_delete=models.CASCADE)
#定义外键(主参考表,参考主键表中的列,admin可为空,可为空,主键表删,也跟着被删除)

第十九章 Django的ORM映射机制的更多相关文章

  1. Python之路【第十九章】:Django进阶

    Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图 学习目标 理解为什么需要法线贴图: 学习法线贴图如 ...

  3. 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器

    原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...

  4. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    原文:第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展. ...

  5. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  6. Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  7. Gradle 1.12翻译——第十九章. Gradle 守护进程

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  8. Gradle 1.12用户指南翻译——第二十九章. Checkstyle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  9. Gradle 1.12用户指南翻译——第三十九章. IDEA 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

随机推荐

  1. python_将多个小字符拼接成大字符?

    案例: 下面有一个列表,如何把这个列表拼接成一个字符串? l = [1, 2, 3, 4, 'a', 'b', 'c'] 有哪些方法? 方法1: for进行迭代拼接 #!/usr/bin/python ...

  2. python_爬校花图片

    如何用python爬取校花图片并保存到本地来? 1. 获取什么数据? 校花名字  name 校花所在学校 school 校花图片的url   img_ulr 2.如何获取? 打开网页http://ww ...

  3. Markdown中使用mermaid画流程图

    Markown语法简单,用来写文档是个不错的选择. 但是Markdown 语法并不直接支持画图,当然方法还是有的. 本人用的Markdown编辑器为vscode,在里面直接安装merdaid插件即可使 ...

  4. 《css定位 position》课程笔记

    这是我学习课程css定位 position时做的笔记! 本节内容 html的三种布局方式 position可选参数 z-index 盒子模型和定位的区别 侧边栏导航跟随实例 html的三种布局方式 三 ...

  5. 一个最简单的cell按钮点击回调

    在cell.h定义 @property(nonatomic,strong)void(^pushType)(NSInteger); 在cell.m按钮点击时  _pushType(1):(举例)     ...

  6. 有关mysql的for update以及 死锁问题

    一.先说锁的概念 锁级别: 1.行级锁: InnoDB引擎(也支持表级锁,默认是行级锁),开销大,加锁慢:会出现死锁.锁定粒度最小,发生锁冲突的概率最低,并发度最高. 2.表级锁:MylSAM引擎和M ...

  7. DFS实现排列组合

    所谓排列,是指从给定的元素序列中依次取出元素,需要考虑取出顺序.比如,取出元素3, 5,因取出顺序的不同,则形成的序列{3, 5}与{5, 3}是不同的排列序列.对于长度为n的元素序列取出k个元素,则 ...

  8. C# 使用GDI制作垂直进度条(由下往上)

    使用GDI+绘进度条的方式多种多样,可以封装一个UserControl,也可以直接使用一个控件来绘制(Label.Image.Panel等),甚至可以直接在winForm上画一个,关键代码没几行(这里 ...

  9. SpringMVC源码之参数解析绑定原理

    摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前,先来认识一个接口 HandlerMethodArgumentResolv ...

  10. 在ASP.NET MVC中使用Web API和EntityFramework构建应用程序

    最近做了一个项目技术预研:在ASP.NET MVC框架中使用Web API和EntityFramework,构建一个基础的架构,并在此基础上实现基本的CRUD应用. 以下是详细的步骤. 第一步 在数据 ...