前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十九章 Django的ORM映射机制

第十九章 Django的ORM映射机制

作者头像
玩蛇的胖纸
发布2018-06-08 13:07:56
9140
发布2018-06-08 13:07:56
举报

第十九章 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可为空,可为空,主键表删,也跟着被删除)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档