• django的基本使用之orm的使用


    准备工作:
    
    当django项目,app应用创建好以后:
    1:在settings里将 INSTALLED_APPS 列表里的app应用名称配置好
    2:新建一个 static 文件夹,用来存放css,js,img等静态文件
    3:文件夹static建立后,需要在settings里对相应文件进行配置
        STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static')
    ]
            # 暴露给外界能够访问服务器静态文件夹下面所有的资源
        此处补充:
             STATIC_URL = '/xxx/'  # 接口前缀 跟静态文件夹的名字没关系,默认保持一致
        对于静态文件夹路径:
             STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static'),  # 就是你的静态文件夹路径
        os.path.join(BASE_DIR,'static1'),
        os.path.join(BASE_DIR,'static2')
    ]
    # ps:会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404
        
    4:所有的html文件默认放在templates文件夹下
        html页面引入外部的资源方式: 
            cdn 引入
            本地将文件放在项目下的文件夹 static 下
      
    5:form 表单触发向后端提交数据的动作的两种方式
          <input type="submit">
          <button></button>  
      
    6:form提交数据的地址指定
         action属性用来控制提交的地址
         方式:
                全路径:
                    <form action="http://127.0.0.1:8000/login/">
                 只写路径后缀:
                     <form action="/login/">
                 不写(默认往当前路径提交)
         form 表单的请求默认是get 
    
    GET和POST是HTTP请求的两种基本方法,最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
    
    ‘标准答案’:9小点
    1.GET在浏览器回退时是无害的,而POST会再次提交请求。
    2.GET产生的URL地址可以被Bookmark,而POST不可以。
    3.GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    4.GET请求只能进行url编码,而POST支持多种编码方式。
    5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    6.GET请求在URL中传送的参数是有长度限制的,而POST么有。
    7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    9.GET参数通过URL传递,POST放在Request body中。
    GET和POST两种请求的简介
    根据客户端请求方式的不同执行不同的逻辑代码
    	def login(request):
    		# 获取用户端提交的请求方式
    		print(request.method)  # 拿到的请求方式是全大写的字符串
    		if request.method == 'GET':
    			return render(request,'login.html')
    		elif request.method == 'POST':
    			return HttpResponse("收到了 老弟")
    	
    	#个人建议按照下面这种方式书写 减少代码冗余及结构混乱的问题
    	def login(request):
    		if request.method == 'POST':
    			return HttpResponse('OK')
    		return render(request,'login.html')
    
    
    
    所定义的函数必需返回一个字符串类型的数据,注意,必需通过HttpResponse去实现,此时不要去纠结另外两个方法,因为其内部也和HttpResponse有关联
    

      

    登陆中遇到的小点:
    
    	def login(request):
    	# 获取用户端提交的请求方式
    	print(request.method)  # 拿到的请求方式是全大写的字符串  GET或者POST 
    	if request.method == 'POST':
    	    print(request.POST)  # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据
    	    # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >
    	    print(request.POST.get('username'))  # value虽然是个列表但是获取value的时候拿到却是单个元素
    	    # 默认只会取value列表里面的最后一个元素
    		# request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}>
    	    print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()
    		print(request.POST['password'])  # 不推荐使用该方法获取数据,通过get去获取
    	return render(request,'login.html')
    	
    	获取value列表里面所有的元素需要使用getlist  应用场景:用户的爱好、多选框
    	get只会获取到value列表的最后一个元素
    

      

    django去连接数据库:
    
    1、找到pycharm右侧的Databases,点击进入,填写相关数据
    2、数据库建立连接后,需要修改配置文件
        DATABASES = {
    			'default': {
    				'ENGINE': 'django.db.backends.mysql',
    				'NAME': 'michael',
    				'HOST':'127.0.0.1',
    				'PORT':3306,
    				'USER':'root',
    				'PASSWORD':'123'
    			}
    		}
    		ps:键必须都是大写
    3、配置文件修改后,替换默认的pycharm连接数据库模块
    方式1:在你的项目文件夹下面的__init__.py
    方式2:也可以在你的应用文件夹下面的__init__.py
    
    固定写法:
        import pymysql
        pymysql.install_as_MySQLdb()  #告诉django用pymysql代替mysqldb连接数据库
    

      

    django的orm:
    
    回顾:
    orm的定义:
    对象关系映射
    		类			》》》  表
    		对象   		》》》  表记录
    		对象的属性          》》》 一条记录某个字段对应的值
    
    django的orm不能够自动帮你创建库,但是可以自动帮你创建表,如下:
    
    from django.db import models
    # Create your models here.
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
        #上述的__str__ 是用来打印对象时,通过控制类内部的该方法,默认打印器name属性。当然也可以更改为其他属性名。
     
    当数据库建立连接后,需要使用 数据库迁移(同步)命令
    python3 manage.py makemigrations  将你的数据库变动记录到一个小本本上(并不会帮你创建表)
    python3 manage.py migrate         将你的数据库变动同步到数据库中
    
    #操作完后,系统会自动加上前缀,避免多个app之间出现相同表名的情况
    

      

    增删改查过程遇到的小点:
    
    
    1.新增数据
    # 操作数据库user表插入数据
    # 方式1:
    user_obj = models.User.objects.create(name=username,password=password)
    # 方式2:
    user_obj = models.User(name=username,password=password)
    user_obj.save()  # 对象调用save方法保存到数据库
    
    #此处的 create 与 save 效果一样,即保存当前的数据
    
    
    
    2.查询数据
    user_list = models.User.objects.all()  # 获取user表所有的数据
    print(user_list )  #<QuerySet [<User: User object>, <User: User object>, <User: User object>]>     获得是QuerySet对象
    #可以通过在类内部定义__str__方法,当对象被打印的时候,获得其name属性
    
    # 只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
    print(user_list.query) 
    
    利用a标签href属性 可以指定页面跳转的路径  href可以写全路径 但是推荐写后缀即可
    <a href="/reg/" class="btn btn-success">添加数据</a>
    
    重定向 redirect
    可以写别人的网址也可以是自己的路径
    return redirect('/userlist')
    return redirect('/userlist/')   #建议如此写,避免重定向
    
    queryset对象的取值:
        索引取值  (不推荐使用)
        .first方法取值   (推荐)
            
    方法.query的使用:只能由queryset类型去使用
    
    
    
    3.删除
    models.User.objects.filter(id=1).delete()  # 会将queryset所有的数据对象全部删除
    #此处的filter  用来过滤出符合条件的所有数据
    
    查询数据时需要注意该数据是queryset还是数据类型,正常的数据类型取值,建议使用下下面的方法:
    user_query = models.User.objects.filter(id=edit_id).first()
    
    此处的id 可通过在url后面带上参数,通过GET请求取值
    
    查询数据的两种方式:
        filter    #建议使用    数据不存在,返回空
        get      #当该属性不存在时,会报错 
    
    
    
    4、编辑
    
    获取编辑对象id的方式:
    方式1:利用input隐藏一个标签   将其type=hidden 即可,同时带上要传回的值
    <input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
    方式二:在form 表单中给action赋值时带上参数
    <form action="/edit/?edit_id={{ user_obj.pk }}" method="post">
    
    编辑:
    方式1:
    models.User.objects.filter(id=edit_id).update(name=username,password=password)
    方式2:获取到当前数据对象
    user_obj = models.User.objects.filter(id=edit_id).first()
    user_obj.name = username
    user_obj.save()
    

      

    当修改完模型层的和表相关的数据后,必须再次执行数据库迁移命令
    python manage.py makemigrations     记录到小本本上
    python manage.py migrate            真正操作数据库
    

      

      

  • 相关阅读:
    多线程与多进程(4)
    多线程与多进程(2)
    多线程与多进程(1)
    Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel
    python学习之爬虫(一) ——————爬取网易云歌词
    str=str.replaceAll("[^a-zA-Z]+", ""); 与 str=str.replaceAll("^[a-zA-Z]+", ""); ^写在里面和写在外面有什么不同,为什么
    java中<T> T和T的区别?
    redis命令
    Linux压缩当前目录下的所有文件-解压
    正则
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/10993941.html
Copyright © 2020-2023  润新知