django--ORM入门到精通
admin
2023-07-23 15:22:13
0


一,Django ORM 与原生SQL对比

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


二、ORM的对应关系

ORM的对应关系:
    类        --->    数据表
    对象      --->    数据行
    属性      --->    字段


三、ORM能做的事儿

ORM能做的事儿:
    1.操作数据表    --->    创建表、删除表、修改表
    2.操作数据行    --->    数据的增、删、改、查
    
    注意事项:不能创建数据库、自己动手创建数据库

四、自己动手手动创建数据库

1. 修改django项目中settings.py 中数据库连接类型:

create database dbs11;


2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库)

#数据库相关配置
DATABASES = {
    'default':{
        #连接的数据库类型
        'ENGINE':'django.db.backends.mysql',
        #连接数据库的地址
        'HOST':'127.0.0.1',
        #数据库端口
        'PORT':3306,
        #连接数据库的名称
        'NAME':"dbs11",
        #连接数据库的用户名
        'USER':'root',
        #连接数据库的密码
        'PASSWORD':'123456'
    }
}


3.告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库

    在项目目录中__init__.py文件中导入MySQL连接配置文件

import pymysql

#告诉Django用pymysql来代替默认的MySQLdb
pymysql.install_as_MySQLdb()


4.在项目如(app)下面的models.py 文件中定义一个类,这个类必须继承models.Model

from django.db import models

#ORM相关的只能写在这个文件里,写到别的文件里Django找不到
##例如:

class UserInfo(models,Model):
    id = models.AutoField(primary_key=True)    #创建一个自增的主键字段
    name = models.CharField(null=False,max_length=16)    #创建一个varchar类型的字段不能为空


5.执行两个命令

python3 manage.py makemigrations
python3 manage.py migrate


说明:以上为通过ORM创建数据库,如果是删除或者修改只需要在models.py文件中删除相关字段然后执行第5步的两个命令即可删除字段。修改同样只需要修改models.py文件然后执行第5步的两个命令即可。


五、通过ORM操作数据库

ORM查询

示例:ORM查询所有用户

#orm查询语法:models.表名.objects.all()   #查询所有
###
ret = models.UserInfo.objects.all()
print(ret[0].id,ret[0].name)

在django项目中应用操作:

后端执行方法:

from django.shortcuts import HttpResponse, render, redirect
from app import models

def user_list(request):
    #去数据库中查询所有的用户
    #利用ORM这个工具去查询数据库,不用自己去查询
    ret = models.UserInfo.objects.all()
    
    # 打开user_list.html文件,
    return render(request, "user_list.html", {"user_list": ret})

前端HTML




    
    用户列表页



添加用户


    
    
        id值
        用户名
    
    
    

    {% for user in user_list %}
        
        {{ user.id }}
        {{ user.name }}
        
    {% endfor %}

    


路由urls.py配置:

from app import views  #导入项目

urlpatterns = [
    url(r'^user_list/',views.user_list)  #定义对应路径关系
]


ORM添加

#orm添加语法:models.表名.objects.create(name=new_name)  #ORM添加

示例:ORM添加用户

models.UserInfo.objects.create(name=new_name)

路由urls.py配置:

from app import views  #导入项目

urlpatterns = [
    url(r'^user_list/',views.user_list),  #定义对应路径关系
    url(r'^user_add/',views.user_add),
    
]

后端执行方法:

def user_add(request):
    if request.method == "POST":
        #用户填写新的用户名,并发送POST请求
        new_name = request.POST.get('username',None)
        #去数据库中创建一条用户记录
        models.UserInfo.objects.create(name=new_name)
        
        ##添加成功后返回展示网页
        return redirect("/user_list/")
    
    #第一个请求页面的时候,就返回一个页面,页面上有两个框让用户填写
    return render(request,"add_user.html")

前端执行的方法:




    
    添加用户




    

用户名:              

         

             


ORM与原生SQL查询

#原生SQL 
#查询所有
select * from user;

##ORM语法:
models.user.objects.all()

###ORM条件语句查询

#filter条件(SQL:where)
models.user.objects.filter(id=1)

#条件大于 
##SQL: SELECT * from user where id>1 and password='123'
#ORM gte
models.user.objects.filter(id__gt=1,password='123')

#条件 like语法
##ORM 
models.user.objects.filter(password__startswith='a')    #以a开头 .这里对大小写敏感,而SQL like不敏感

models.user.objects.fileter(username__icontains='a')    #对大写不敏感的,即a,A都匹配

#SQL in 语句对比ORM语句
select ... where id in(1,2,3,4);

models.user.objects.filter(id__in=[1,2,3,4])

##ORM查询日期
models.user.objects.filter(register_date_month=5)
models.user.objects.filter(register_date_month=5)[0].register_date
#对比SQL语句
select ... where extract('month' from pub_date) = '12';


##ORM批量创建用户
#有100个创建对象
objs = [models.user(title='name{}'.format(i)) for i in range(100)]

models.user.objects.bulk_create(onjs,10)    #这里是10个一提交,即每次创建10个用户


相关内容

热门资讯

摇晃的致命球体,逼退“世界第一... 美国和伊朗在瑞士比尔根山举行谈判并达成协议前夕,被视作美伊冲突“风暴眼”的霍尔木兹海峡仍然动荡不安。...
日菲胆敢非法“划界”,必将自食... 近日,日本与菲律宾发表联合声明,宣布正式启动日菲间专属经济区和大陆架的划界谈判。这场以“海洋划界”为...
特朗普和美议员爆发争吵,激烈互... 美国国会参议院6月23日通过一项限制总统战争权力的决议,特朗普对此十分不满。他24日造访国会时,与共...
苏丹中部霍乱疫情严峻,一个多月... 当地时间6月24日,世界卫生组织总干事谭德塞表示,苏丹中部西科尔多凡州霍乱疫情持续蔓延。自5月15日...
他或成英国新首相,特朗普表态 英国首相斯塔默日前宣布辞职,他的继任者极有可能是前大曼彻斯特市长、议员伯纳姆。美国总统特朗普近来与斯...
人民日报钟声:急修“安保三文件... 急修“安保三文件”,暴露日本加速军事转轨的急躁姿态(钟声)《人民日报》(2026年06月25日 第 ...
小伙凌晨酒店按摩从房间坠亡,酒... 一名“00后”小伙与同事聚餐饮酒后,凌晨前往一酒店接受按摩,却从酒店房间坠楼身亡。据酒店相关负责人以...
内塔尼亚胡称只要其在任以军就不... △内塔尼亚胡(资料图)当地时间24日,以色列总理内塔尼亚胡在以色列地方政府联合会上发表讲话,谈及以军...
瑞士谈判核心诉求为何?议长会否... 美伊瑞士谈判刚刚结束,双方对谅解备忘录各执一词。我在伊朗外交部新闻发布会现场提问:从瑞士谈判到阿曼磋...
鲁比奥:美伊本月底将继续技术磋... △鲁比奥(资料图)24日多方消息显示,美国国务卿鲁比奥表示,美国和伊朗技术团队将于6月底在瑞士继续举...