• 第十九章 Django的ORM映射机制


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



  • 相关阅读:
    在页面跳转的时候,在跳转后的页面中使用js 获取到 页面跳转的url中携带的参数。
    使用js处理后台返回的Date类型的数据
    java后端时间处理工具类,返回 "XXX 前" 的字符串
    前端分页神器,jquery grid的使用(前后端联调),让分页变得更简单。
    后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用
    使用SSM 或者 springboot +mybatis时,对数据库的认证信息(用户名,密码)进行加密。
    swagger2 常用注解的使用
    SSM项目 以及 springboot 中引入swagger2的方法
    jquery grid 获取选中的行的数据,以及获取所有行的方法
    关于使用ssm与spring时,配置tomcat 虚拟目录( doBase )中的一些坑
  • 原文地址:https://www.cnblogs.com/xuepangzi/p/8283257.html
Copyright © 2020-2023  润新知