【005】- Django模型数据操作(一)

接上一篇内容,本篇我们将介绍模型查询相关的知识。本篇以前面介绍的User表和Role表进行说明。

数据添加

数据添加的途径主要有三种,一种是通过后台管理界面添加,一种是通过数据库添加,还有一种是通过Django提供的模型操作对象添加。在这里我们主要以第三种方式为主。
为了演示方便,我们打开数据库日志,在my.cnf中打开以下注释

general_log = 3
general_log_file = /tmp/mysql.log

重启mysql服务

sudo mysqld restart

监听查看日志

sudo tail -f /tmp/mysql.log

单条数据添加,上面是Django操作指令,下面是Mysql日志

from beardata_sys.models import User,Role
role = Role(id='1',name='admin',type=0,remark='管理员角色')
role.save()

在这里插入图片描述
批量数据添加

插入角色

role_list = list()
role_list.append(Role(id='2',name='normal',type=1,remark='普通角色'))
role_list.append(Role(id='3',name='guest',type=2,remark='游客'))
Role.objects.bulk_create(role_list)

在这里插入图片描述
插入用户

from beardata_sys.models import User,Role
user_list = list()
user_list.append(User(id='1',name='beardata',password='beardata',age=20,remark='beardata用户',user_role=Role.objects.get(id=1)))
user_list.append(User(id='2',name='django',password='django',age=23,remark='django用户',user_role=Role.objects.get(id=2)))
User.objects.bulk_create(user_list)

在这里插入图片描述

数据查询

在前面我们插入数据后会返回一个object,在shell中我们看不到具体数据,如果想要看到数据,我们可以在model类中实现 __str__方法,具体代码如下
User类中代码

    def __str__(self):
        return "id=" + self.id + ",name=" + self.name + ",age=" + str(self.age) + ",remark=" + self.remark

Role类中代码

    def __str__(self):
        return "id=" + self.id + ",name=" + self.name + ",type=" + str(self.type) + ",remark=" + self.remark

重新执行查询
在这里插入图片描述

条件查询
  1. 查询等
    exact:
    查询用户名为 “beardata” 的用户
from beardata_sys.models import User
user_list = User.objects.filter(name__exact='beardata')
# 简写
user_list = User.objects.filter(name='beardata')

在这里插入图片描述
2. 模糊查询
i_exact: LIKE 查询
查询用户名是 "beardata"的用户,忽略大小写

from beardata_sys.models import User
user_list = User.objects.filter(name__iexact='beardata')

在这里插入图片描述
contains: 是否包含 LIKE ‘%查询关键字%’
查询用户名中包含 "beadata"的用户

from beardata_sys.models import User
user_list = User.objects.filter(name__contains='beardata')

在这里插入图片描述
startswith、endswith:以指定值开头或结尾
查询以 "bear"开头的用户名的用户

from beardata_sys.models import User
user_list = User.objects.filter(name__startswith='bear')

在这里插入图片描述
注:

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith。

  1. 空查询
    isnull:是否为null,值为 True/False
    查询用户表中描述不为空的用户
from beardata_sys.models import User
user_list = User.objects.filter(remark__isnull=False)

在这里插入图片描述
4. 范围查询
in: 是否在范围内
查询id是1,2的数据

from beardata_sys.models import User
user_list = user.objects.filter(id__in=[1,2])

在这里插入图片描述
5. 比较查询
gt、gte、lt、lte:大于、大于等于、小于、小于等于
查询年龄大于20的用户

from beardata_sys.models import User
user_list = User.objects.filter(age__gt=20)

在这里插入图片描述
7. 日期查询
year、month、day、week_day、hour、minute、second、range:对日期时间类型的属性进行运算
查询2020年创建的用户

from beardata_sys.models import User
user_list = User.objects.filter(create_time__year=2020)

在这里插入图片描述
查询在2020年1月1日后创建的用户

from beardata_sys.models import User
import datetime
user_list = User.objects.filter(create_time__date__gt=datetime.date(2020,1,1))

在这里插入图片描述
查询在2020年1月1日到2020年3月1日之间创建的用户

from beardata_sys.models import User
import datetime
start_date = datetime.date(2020,1,1)
end_date = datetime.date(2020,3,1)
user_list = User.objects.filter(create_time__range=(start_date,end_date))

在这里插入图片描述

F对象

之前的查询都是对象的属性与常量值比较,两个属性之间使用F对象,其被定义在django.db.models中。
语法如下:

F(属性名)

查询更新时间大于创建时间的用户

from beardata_sys.models import User
from django.db.models import F
user_list = User.objects.filter(update_time__gte=F('create_time'))

在这里插入图片描述

Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
查询年龄大于20,并且编号小于3的用户

from beardata_sys.models import User
from django.db.models import Q
user_list = User.objects.filter(age__gt=20,id__lt=3)
# 或者用下面的
user_list = User.objects.filter(age__gt=20).filter(id__lt=3)

在这里插入图片描述
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
查询年龄大于20或者id小于3的用户

from beardata_sys.models import User
from django.db.models import Q
user_list = User.objects.filter(Q(age__gt=20) | Q(id__lt=3))
user_list

在这里插入图片描述
查询id不等于3的用户

from beardata_sys.models import User
from django.db.models import Q
user_list = User.objects.filter(~Q(id=3))
user_list

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值