orm操作

内容概要

  • django orm简介
  • orm创建表
  • orm字段增删改查
  • orm记录增删改查
  • orm外键的创建

django orm简介

1、什么是OPM?
	ORM:对象关系映射
    
2、为什么要用ORM?
	能够让不会写SQL语句的python程序员 
    使用面向对象的语法即可简单快捷的操作MySQL,极大地提升开发效率
	'''但是ORM有时候自动生成的SQL效率可能会很低'''

类			表
对象			一行行记录
对象点属性     记录某个字段对应的值
# 如何使用ORM?
	在django应用文件夹下的models.py中操作
  
"""orm无法创建库 需要自己提前创建好"""

orm创建表

# 强调:只要在models.py中改动了与数据库相关的代码,就必须重新执行迁移命令

1、先在models.py中创建表

	1)在models.py创建字段
        class User(models.Model):  # 相当于create table user
            id = models.AutoField(verbose_name='编号',primary_key=True)  # 创建主键
            name = models.CharField(verbose_name='姓名',max_length=32)   # name charvar(32)
            pwd = models.IntegerField(verbose_name='密码')   # pwd int  verbose_name:注释
        
	2)主键字段可以不用创建,orm自动帮你创建一个名为id的主键字段。
    	# 但是主键字段只能名为id,别的主键字段名称只能自己创建


2、执行数据库迁移命令(在命令行执行)
	1)执行迁移命令
    	python3 manage.py makemigrations   # 将改动的记录在migrations文件夹中
        # 可能缺少底层文件:pip3 install pillow
        
    2)确认提交给数据库(真正修改数据库)
    	python3 manage.py migrete
        
# 迁移命令快捷方式:
	pycharm快捷提示 : tools  >>>  run manage.py task

orm创建注意事项

1、主键字段orm会自动创建 只不过名字固定为id
2、CharField字段类型必须要有max_length参数
3、orm无法创建库,只能操作表层级

字段的增删改查

# 增
    # 当表中已经有数据存在的情况下如果添加新的字段那么需要设置null或者default
    age = models.IntegerField(verbose_name='年龄',null=True)# 一种是字段为空
    gender = models.CharField(verbose_name='性别',max_length=32,default='male')  # 一种是设置默认值
    
# 改
	代码层面修改后,在执行数据库迁移命令
    
# 查
	pycharm点database中的表
    
# 删
	把相对应的代码注释掉或者删除。但是注释后代码,对应的列数据也会消失。  # 谨慎删除,无法恢复数据

使用Python Console报错信息

把python/helpers/third_party/thriftpy/_shaded_thriftpy/_compat.py文件出错的地方的代码改为:

if PY3:
        args = [len(varnames),
                0,
                len(varnames),
                code.co_stacksize,
                code.co_flags,
                code.co_code,
                code.co_consts,
                code.co_names,
                varnames,
                code.co_filename,
                "__init__",
                code.co_firstlineno,
                code.co_lnotab,
                code.co_freevars,
                code.co_cellvars]
        if sys.version_info >= (3, 8, 0):
            #Python 3.8 and above supports positional-only parameters. The number of such
            #parameters is passed to the constructor as the second argument.
            args.insert(2, 0)
        new_code = types.CodeType(*args)
    elif JYTHON:
        from org.python.core import PyBytecode

数据的增删改查

查询
1、全部查询
	models.User.objects.all()   # all:拿取全部
    
2、条件查询
	models.User.objects.filter(name='meng')  # filter:过滤
    models.User.objects.filter(name='meng',password='123')  # 多条件查询,逗号相当于and
    
3、实例化对象查询
	user_obj = models.User.objects.filter(name='meng').first()
    user_obj.name
    
<QuerySet [<User: mengNB6661>, <User: zhang>, <User: liu11>, <User: meng>]>
# QuerySet我们可以简单的理解为是列表套一个个数据对象
增加
1、普通增加
	models.User.objects.create(name='gao',password='123')

2、对象增加
    obj = models.User(name='li',password='113')  # 在没保存之前,不会对数据库进行更改
    obj.password = 333  # 没保存之前可以修改数据
    obj.save()  # 对象调用save方法保存到数据库
修改
1、先查询在修改
    cat_obj = models.User.objects.filter(id=3)[0]  # 类产生对象
    cat_obj.name='liu11'  # 对象调用修改
    cat_obj.save()    # 对象调用save方法保存到数据库
    
2、直接修改  # 常用
	models.User.objects.filter(name='meng').update(name='mengNB')
    # update user set name='jasonNB' where name='jason';
删除
1、直接删除
	models.User.objects.filter(id=8).delete()
    # delete from user where id=5;

orm外键创建

一对多外键关系  
	"""在orm中 外键字段建在多的一方"""
多对多外键关系
	"""在orm中 可以直接写在查询频率较高的表中(自动创建第三张表)"""
一对一外键关系
	"""在orm中 直接写在查询频率较高的表中"""
    
# 一对多
    publish = models.ForeignKey(to='Publish')
# 多对多
    authors = models.ManyToManyField(to='Author')  # 自动创建书籍和作者的第三张关系表
# 一对一
    author_detail = models.OneToOneField(to='AuthorDetail')
    
"""
ForeignKey OneToOneField  会自动给字段加_id后缀
"""
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    # 一对多
    publish = models.ForeignKey(to='Publish')
    # 多对多
    authors = models.ManyToManyField(to='Author')  # 自动创建书籍和作者的第三张关系表

class Publish(models.Model):
    title = models.CharField(max_length=32)

class Author(models.Model):
    name = models.CharField(max_length=32)
    # 一对一
    author_detail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    addr = models.CharField(max_length=32)
    phone = models.BigIntegerField()

数据展示页小练习

首页

def home(request):
    # 1.查询user表中的所有数据
    user_data = models.User.objects.all()
    # 2.将数据利用模板语法传递给html文件
    return render(request,'home.html',locals())

注册

def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 先比对用户名是否重复
        is_exists = models.User.objects.filter(name=username)  # 如果有值,代表用户名重复了
        if is_exists:
            return HttpResponse('用户名已存在')
        # 将用户数据写入数据库
        models.User.objects.create(name=username,password=password)
        # 返回数据展示页面
        return redirect('/home/')
    return render(request,'register.html',locals())

删除数据

def data_delete(request):
    # 获取用户需要删除的唯一标识
    delete_id = request.GET.get('delete_id')
    # 利用orm删除即可
    models.User.objects.filter(id=delete_id).delete()  # 先利用条件筛选出来,再删除
    # 返回数据展示页
    return redirect('/home/')

修改数据

def cat_edit(request):
    # 1.获取用户想要修改唯一主键标识
    edit_id = request.GET.get('edit_id')

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 修改表数据
        models.User.objects.filter(id=edit_id).update(name=username,password=password)
        # 返回展示页
        return redirect('/home/')
    # 2.查询用户想要修改的数据
    edit_obj = models.User.objects.filter(id=edit_id).first()   # 列表套对象
    '''filter取值的结果是一个列表套对象,在取值的情况下推荐用first方法'''
    # 3.返回给用户一个编辑页面,上面写好用户编辑的数据
    return render(request,'cat_edit.html',locals())

主页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">数据展示页面</h1>
        <div class="col-md-8 col-md-offset-2">
            <table class="table table-hover table-striped">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>password</th>
                        <th>others</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in user_data %}
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.name }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                                <a href="/cat_edit/?edit_id={{ user_obj.id}}" class="btn btn-primary btn-xs">编辑</a>
                                <a href="/data_delete/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
            <a href="/register/" class="btn btn-success">用户注册</a>
        </div>
    </div>
</div>
</body>
</html>
posted @ 2021-11-25 14:42  迷恋~以成伤  阅读(158)  评论(0)    收藏  举报