• Django-(二).模型层


    一、ORM:

    ORM将一个Python的对象映射为数据库中的一张关系表。它将SQL封装起来,程序员不再需要关心数据库的具体操作,只需要专注于自己本身代码和业务逻辑的实现。

    于是,整体的实现过程就是:Python代码,通过ORM转换成SQL语句,再通过pymysql去实际操作数据库。

    优点:
    a. 简单,不用自己写SQL语句
    b. 开发效率高
    缺点:
    a. 记忆你这个特殊的语法
    b. 相对于大神些的SQL语句,肯定执行效率有差距

    二、ORM的对应关系:

    类 ---> 数据表
    对象 ---> 数据行
    属性 ---> 字段

    三、ORM能做的事儿:

    a. 操作数据表 --> 创建表/删除表/修改表
    操作models.py里面的类

    b. 操作数据行 --> 数据的增删改查

    四、使用Django的ORM详细步骤:

    a. 自己动手创建数据库 (不能创建数据库,自己动手创建数据库)
    create database 数据库名;
    b. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库)

    DATABASES = {
    	'default': {
    		'ENGINE': 'django.db.backends.mysql',  # 连接的数据库类型
    		'HOST': '127.0.0.1',  # 连接数据库的地址
    		'PORT': 3306,  # 端口
    		'NAME': "day61",  # 数据库名称
    		'USER': 'root',  # 用户
    		'PASSWORD': '123456'  # 密码
    	}
    }
    
    1. 告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库
      在项目/init.py文件中,写下面两句:
    import pymysql
    # 告诉Django用pymysql来代替默认的MySQLdb
    pymysql.install_as_MySQLdb()
    
    1. 在app下面的models.py文件中定义一个类,这个类必须继承models.Model
    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)  # 创建一个自增的主键字段
        name = models.CharField(null=False, max_length=32)   # 创建一个varchar(20)类型的不能为空的字段
    
        def __str__(self):
            return "<{}-{}>".format(self.id, self.name)   #默认属性
    # print(models.UserInfo.objects.all())        
    # <QuerySet [<UserInfo: <1-a>>, <UserInfo: <2-b>>, <UserInfo: <3-c>>, <UserInfo: <4-c>>, <UserInfo: <5-d>>, <UserInfo: <6-e>>, <UserInfo: <7-f>>]>
    
    1. 执行两个命令
      a. python3 manage.py makemigrations #记录models文件的变动
      b. python3 manage.py migrate #翻译记录并执行sql

    对数据进行增删改查

    1.查询数据库中的数据

    models.UserInfo.objects.all()
    models.UserInfo.objects.all().values('user') #只取user列
    models.UserInfo.objects.all().values_list('id','user') #取出id和user列,并生成一个列表
    models.UserInfo.objects.get(id=1)
    models.UserInfo.objects.get(user='yangmv')

    from app01 import models  #加入models
    def user(request):
        user = models.UserInfo.objects.all() #与models中UserInfo类建立联系,并获取所有的用户
        return render(request, 'user_list.html', {'user_list': user})  #将数据替换到html中
    

    user.list.html页面代码:

    <tbody>
    {% for user in user_list %}
        <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        </tr>
    {% endfor %}
    </tbody>
    

    添加数据(通过POST请求)

    models.UserInfo.objects.create(user='yangmv',pwd='123456')
    或者
    obj = models.UserInfo(user='yangmv',pwd='123456')
    obj.save()
    或者
    dic = {'user':'yangmv','pwd':'123456'}
    models.UserInfo.objects.create(**dic)

    # 添加用户的函数
    def add_user(request):
        if request.method == "POST":  #查看请求的方法
            # 用户填写了新的用户名,并发送了POST请求过来
            new_name = request.POST.get("username", None)
            # 去数据库中新创建一条用户记录
            models.UserInfo.objects.create(name=new_name)
            # return HttpResponse("添加成功!")
            # 添加成功后直接跳转到用户列表页
            return redirect("/user_list/")
    
        # 第一个请求页面的时候,就返回一个页面,页面上有两个框让用户填写
        return render(request, "user_list.html")
    

    user_list.html页面代码:

    <form action="/add_user/" method="post">
        <p>用户名:
            <input type="text" name="username">
        </p>
    
        <p>
            <input type="submit" value="提交">
        </p>
    </form>
    

    删除数据

    用户点击是GET请求,通过GET获取id来执行删除操作
    models.UserInfo.objects.filter(user='yangmv').delete()

    <td>
    <a href="/delete/?id={{ user.id }}">删除</a>
    </td>
    
    def delete_user(request):
        print(request)  #<WSGIRequest: GET '/delete/?id=10'>  在html中定义
        print(request.GET)  #<QueryDict: {'id': ['10']}>
        print("=" * 120)
        del_id = request.GET.get("id", None) #对字典用get取值,如果没有返回None
        print(del_id)  #9
        if del_id:
            models.UserInfo.objects.get(id=del_id).delete()
            return redirect("/user_list/")
        else:
            return HttpResponse("要删除的数据不存在!")
    

    编辑数据

    models.UserInfo.objects.filter(user='yangmv').update(pwd='520')
    或者
    obj = models.UserInfo.objects.get(user='yangmv')
    obj.pwd = '520'
    obj.save()

    通过user_list.html,选择要修改的数据,进去edit.html
    为了在修改栏中显示默认的数据,利用url传递id参数,随后生成edit_obj 对象传入到edit.html,通过edit_obj对象在html中显示id以及原始数据
    在edit.html修改数据,edit.html中name接受新数据,id负责在函数中获取原始数据

    {# 通过对象参数edit取值 #} {# 设置默认值,通过对象参数edit取值 #}
  • 相关阅读:
    手动访问和传参
    子路由
    matlab 不同尺度的矩阵存储
    贝叶斯决策
    vim的使用
    linux另一种安装方式
    Linux中profile、bashrc、bash_profile之间的区别和联系
    emacs编辑器的使用
    关于鼠标不敏感导致自以为ubuntu很怪的问题
    各种可以远程
  • 原文地址:https://www.cnblogs.com/orange-lsc/p/12055719.html
Copyright © 2020-2023  润新知