博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django之ORM基础
阅读量:4984 次
发布时间:2019-06-12

本文共 7842 字,大约阅读时间需要 26 分钟。

Django之ORM操作(基础部分)

一、准备工作

第一步:创建数据库(以MySQL数据库为例)

  创建时一定要指定数据库的编码格式,否则存入数据时会报错。

mysql> CREATE DATABASE mysite DEFAULT CHARACTER SET utf8;

 

第二步:配置数据库连接信息

  配置文件:\mysite\mysite\settinDATABASES = {

'default': {            'ENGINE': 'django.db.backends.mysql',  # 数据库引擎            'NAME': "mysite",              # 数据库名称            "USER":"root",                # 连接数据库的用户名                          "PASSWORD":"Admin@123!",          # 连接数据库的密码            "HOST": "127.0.0.1",            # 数据库的IP地址            "POST":"3306",                # 数据库的端口,mysql默认为3306        }    }

 

第三步:安装pymysql

  不装pymysql会报错

  windows下安装方法:管理员身份运行cmd然后运行 pip3 install pymysql

  在django中配置:\mysite\mysite\__init__.py

import pymysqlpymysql.install_as_MySQLdb()

 

二、使用方法

1.创建表

  创建表的代码都写在\mysite\app\models.py文件下from django.db import models

# Create your models here.# 账号信息表class Userinfo(models.Model):    username = models.CharField(max_length=30, verbose_name="账号")    password = models.CharField(max_length=255, verbose_name="密码")    email = models.EmailField(max_length=254, verbose_name="邮箱",null=True)    registration_time = models.DateTimeField(auto_now_add=True,verbose_name="注册时间")    mobile_phone = models.CharField(max_length=11,verbose_name="电话",null=True)    account_status = models.ForeignKey("Account_status",on_delete=None)    role = models.ManyToManyField("Role")    def __str__(self):        return self.username# 账号状态表class Account_status(models.Model):    account_status = models.CharField(max_length=20,verbose_name="账号状态")    # def __str__(self):    #     return self.account_status# 账号角色表class Role(models.Model):    role_name = models.CharField(max_length=20, verbose_name="角色")    comment = models.CharField(max_length=255,null=True)    def __str__(self):        return self.role_name# 主机列表信息表class Machinelist(models.Model):    hostname = models.CharField(max_length=30,verbose_name="主机名")    os = models.CharField(max_length=30,verbose_name="操作系统")    username = models.CharField(max_length=30,verbose_name="用户名")    password = models.CharField(max_length=255,verbose_name="密码")    ipaddress = models.GenericIPAddressField(verbose_name="IP地址")    def __str__(self):        return self.hostname# 主机所属的组class Group(models.Model):    group_name = models.CharField(max_length=30,verbose_name="组名")    hrough='Machine2Group',       ## 自定义中间表
through_fields=('machine','group') # 第三张表中的字段
  def __str__(self):      return self.group_name # 自己创建主机和组的关联表(第三张表) class Machine2Group(models.Model):   machine = models.ForeignKey("Machinelist", on_delete=None)   group = models.ForeignKey("Group",on_delete=None)

 

2.初始化数据库

python manage.py makemigrations  #让修改动作保存到记录文件中
  python manage.py migrate  #让操作实际应用到数据库上

 

3.表的基本操作

  关于表的操作都写在\mysite\app\views.py文件下

  3.1 create 增

    3.1.1 单表操作 :2种方法4种方式

    3.1.1.1 方法1:create()               方式1:   直接传值            models.Role.objects.create(role_name="admin",comment="管理员")           方式2:   传入一个字典            role={
"role_name":"user","comment":"普通用户"}     models.Role.objects.create(**role) 3.1.1.1 方法2:save() 方式1: 创建对象时赋值 stat1=models.Account_status(account_status="冻结") # 创建对象 stat1.save()                        # 执行save方法时才将将数据写入数据库 方式2: 先创建对象,然后赋值保存 stat2=models.Account_status() stat2.account_status="活跃" stat2.save()

 

    3.1.2 多表操作

3.1.2.1 一对多:            方式一:直接赋值            models.Userinfo.objects.create(username="admin",password="123456",account_status_id=2)            方式二:先获取对象再赋值              stat_obj=models.Account_status.objects.get(account_status="活跃") #先从父表总获取对象            print(type(stat_obj))            print(stat_obj)        # 然后把对象赋值给子表中的字段            models.Userinfo.objects.create(username="zhangsan",password="123456",account_status=stat_obj)        3.1.2.1 多对多:            A:Django自动创建第三张表的情况   使用add()方法            user = models.Userinfo.objects.get(username="admin")            role = models.Role.objects.get(role_name="admin")            user.role.add(role)    #add(obj1,obj2,obj3)  可以传入多个对象            user = models.Userinfo.objects.filter(username="admin")//结果必须是一个可迭代对象            role = models.Role.objects.get(role_name="user")            role.userinfo_set.add(*user)            B:对于用户创建第三张表的情况                分别获取需要关联的对象,然后再第三张表中插入对象                格式:models.关联表.objects.create(字段名=对象,字段名=对象)                machine_obj = models.Machinelist.objects.filter(id=1)[0]                group_obj = models.Group.objects.filter(id=1)[0]                models.Machine2Group.objects.create(machine=machine_obj,group=group_obj)

 

  3.2 filter 查

    3.2.1 单表查询

# 检索多个对象            # 返回所有对象,查询所有数据,可以使用切片指定返回的范围            print(models.Userinfo.objects.all()[:2])            # 过滤对象            host = models.Machinelist.objects.filter(hostname="localhost")            print(models.Machinelist.objects.exclude(ipaddress="192.168.1.100"))        # 检索一个对象:没有匹配到货匹配到多个都会报错            print(models.Machinelist.objects.get(ipaddress="192.168.1.100"))        # 查询结果再处理            order_by()         对结果排序            reverse()          对查询结果反向排序            exists()          如果QuerySet包含数据,就返回True,否则返回False            distinct()        从返回结果中剔除重复纪录            values()          返回字典序列,每一行的数据以字典的形式返回            values_list()     返回元组序列,每一行的数据以元组的形式返回            count()            返回数据库中匹配查询(QuerySet)的对象数量。            first()            返回第一条记录            last()             返回最后一条记录        # 双下划线            格式例:print(models.Group.objects.filter(id__in=[1,2]))            参数:            __gt    大于            __lt    小于            __gte   大于或小于            __lte   小于或等于        __icontains 包含,对大小写敏感            __startwith  __endwith        __istartwith __iendwith             __range(start,end)            __isnull

 

    3.2.2 多表查询

3.2.2.1一对多            正向查询            # 查询admin用户的账户状态            print(models.Userinfo.objects.filter(username="admin").values("account_status__account_status"))            反向查询            print(models.Account_status.objects.filter(userinfo__username="admin").values("account_status"))        3.2.2.2多对多            正向查询            #通过用户表查询admin用户的角色            print(models.Userinfo.objects.filter(username="admin").values("role__comment"))            反向查询            #通过角色表查询admin角色下的用户            print(models.Role.objects.filter(userinfo__username="admin").values("comment"))            注:实验中发现只有系统自建的第三张表可以这样做

 

    3.2.3 懒惰的queryset

      用的时候才会触发SQL语句,已经执行过的放在缓存中

      特点:可迭代,可切片,有缓存
      缓存处理:当处理的数据量较大时,SQL执行的结果一次性放入内存会造成很大的压力。
      解决方法:使用.iterator() 将对象变成变成迭代器

例:            objs = models.Machinelist.objects.all()            for obj in objs.iterator():                print(obj.hostname)                但是:每一次遍历都会执行一次SQL语句

 

    3.2.4 分组查询与聚合查询

3.2.4.1 聚合查询aggregate(*args,**kwargs):            from  django.db.models import Avg,Min,Max,Sum            print(models.Userinfo.objects.all().aggregate(Avg("id")))        3.2.4.1 分组查询annotate(*args,**kwargs):            from  django.db.models import Avg,Min,Max,Sum            print(models.Userinfo.objects.values("role__comment").annotate(Max("id")))

 

    3.2.5 F查询与Q查询

3.2.5.1 F查询 对对象中的某列值进行操作            form django.db.models import F            models.Book.objects.all().update(price=F("proce")+20)  加、减、乘、除、取模以及幂运算等算术操作        3.2.5.2 Q查询 复杂的查询            from  django.db.models import  Q            # 查找用户名为admin或密码为123456的对象            print(models.Userinfo.objects.filter(Q(username="admin")| Q(password="123456")))

 

  3.3 delete 删

    .delete()

    找到需要删除的对象,执行delete方法

  3.4 update 改

3.4.1save 方法        admin = models.Userinfo.objects.get(username="admin")        admin.password="admin@123!"        admin.save()        3.4.2update 方法        models.Userinfo.objects.filter(username="zhangsan").update(password="zhangsan")

 

 

4.admin配置

 

转载于:https://www.cnblogs.com/gaoyuanzhi/p/9370270.html

你可能感兴趣的文章
各种抗锯齿模式略解:SSAA MSAA CSAA CFAA
查看>>
Oracle 11g中修改默认密码过期天数和锁定次数
查看>>
分布式开源调度框架TBSchedule原理与应用
查看>>
css3-无缝滚动左右滚动,且可以暂停
查看>>
161101、在Java中如何高效判断数组中是否包含某个元素
查看>>
170518、FastDFS_配置文件详解
查看>>
Scala: Case classes
查看>>
160530、memcached集群(spring集成的配置)
查看>>
2016summer 训练第一场
查看>>
1.1最基本的使用--maven的下载与安装
查看>>
关于Web与JS
查看>>
软件说明
查看>>
ebook-nodej
查看>>
Qt学习(14)
查看>>
015_NGINX作为WebSocket Proxy的设置
查看>>
NOIP2011T2 统计单词数
查看>>
springboot情操陶冶-@Conditional和@AutoConfigureAfter注解解析
查看>>
每日5min分享-接口测试框架
查看>>
超好用超短的小程序请求封装
查看>>
Android开发随手记
查看>>