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取值 #}
posted @ 2019-12-17 17:29  薄荷少年郎微微凉  阅读(156)  评论(0编辑  收藏  举报