Django学习记录(9)Django中的模型操作
2020-07-06 11:34
573 查看
进入shell脚本编程
终端中输入
python manage.py shell
# 原模型代码 class Student(models.Model): # 表名的命名规则为:应用名_模型名 name = models.CharField(max_length=50, verbose_name="学生名") email = models.EmailField(verbose_name="邮箱") birth = models.DateField(verbose_name="出生日期", db_column="birthday") tel = models.CharField(max_length=11, verbose_name="联系方式") creat_time = models.DateTimeField(auto_now=True) __sex_type = ( ('m', '男'), ('f', '女'), ('s', '保密'), ) sex = models.CharField(max_length=4, choices=__sex_type, verbose_name="性别") def __str__(self): return self.name
导入模型
from user.models import Student
模型中数据的新增
方式一:
# 创建一个模型对象 并设置属性 # 构建student对象的时候 关键字参数必须是模型中的属性名 stu = Student(name='张三',email='123@qq.com',birth='1990-08-19',tel='123456',sex='m') stu.save()
方式二:
# 模型管理器对象来新增数据 create方法返回一个模型对象 # 类名.objects.create() Student.objects.create(name='张三',email='123@qq.com',birth='1990-08-19',tel='123456',sex='m')
模型中数据的修改
方式一:
student = Student(id='3',name='张三',email='123@qq.com',birth='1990-08-19',tel='123456',sex='m') student.save()
save()方法可以实现数据的更新和新增效果
- 模型对象中,如果主键不存在,则一定是新增
- 模型对象中,如果主键有值,则在表中存在,则更新
- 模型对象中,如果主键有值,但数据库表中数据不存在,则新增
方式二:
通过QuerySet对象中的update方法进行数据的修改
推荐使用这种 效率更高
# 根据ID进行数据的修改 queryset = Student.objects.filter(pk=1) # 相当于 select * from 表 where id = 1 # filter方法返回一个QuerySet对象 queryset.update(name='zhangsan', tel='123456') # 其他字段不会修改,update方法返回影响的行数
模型中数据的删除
方式一:
模型对象调用delete()方法
# 获取模型对象 stu = Student.object.get(pk=1) # 调用delete方法删除数据 stu.delete
需要注意的是
get方法如果查询不到数据或者查到多条数据时会报错
方式二:
推荐
# 获取QuerySet对象 queryset = Student.objects.filter(pk=1) # 调用delete方法删除数据 queryset.delete()
模型中数据的查询
Model.objects返回一个Manage对象
模型管理器对象常见的方法:
- filter():相当于数据库中的where,返回QuerySet对象
- exclude():和filter用法类似,排除满足条件的数据,返回QuerySet对象
- all():相当于select * from 查询所有满足条件的数据,返回QuerySet对象
- get():返回一个模型对象
- create():用于新增数据,返回一个模型对象
- value():查询模型中指定的属性,返回一个Queryset对象
- distinct():用于对结果进行去重
- first():查询第一条记录,返回一个模型对象
- last():查询最后一条记录,返回一个模型对象
- order_by():按照指定的属性进行排序,多个属性排序用逗号分隔,属性前使用’-'代表降序排列
QuerySet常见的方法
- filter():返回QuerySet对象
- exclude():返回QuerySet对象
- all():返回QuerySet对象
- get():返回模型对象
- first():返回模型对象
- last():返回模型对象
- values():返回QuerySet对象
- distinct():返回QuerySet对象
- delete():返回QuerySet对象
- order_by() :返回QuerySet对象
查询中的条件查询:
- 关系查询:
__gt= 大于 __gte= 大于等于 __lt= 小于 __lte= 小于等于 = 等于 __exact= 等于 __iexact= 忽略大小写等于 Student.objects.filter(age__lt=18) # 查询学生中年龄小于18的
- 逻辑查询
# 逻辑与 and # 查询姓名包含'张',且电话号码为空的数据 # 方式一: Student.object.filter(name__startswith='张',tel__isnull=True) # 方式二: Student.object.filter(Q(name__startswith='张')&Q(tel__isnull=True)) # 相当于select * from t_student where name like '张%' and tel is null; # 逻辑或 or # 需要导入一个Q函数 from django.db.models import Q Student.objects.filter(Q(name__startswith='张')|Q(tel__isnull=True))
- 区间查询
__range(min, max) Student.objects.filter(score__range=(80, 100)) # 相当于select * from t_student where score between 80 and 100;
- 模糊查询
__startswith= 以...开头 __istartswith= 以...开头,忽略大小写 __endwith= 以...结尾 __iendwith= 以...结尾,忽略大小写 __contains= 包含... __icontains= 包含...,忽略大小写
- 空值查询
# 查询电话号码为空的学生 Student.objects.filter(tel__isnull=True) # 相当于select * from t_student where tel is null;
- 枚举查询
__in=(区间) Student.objects.filter(id__in=(2,3,4)) # 相当于select * from t_student where id in (2, 3, 4)
get
如果查询的结果为空,则抛出DoseNotExist
如果查询的结果超过一条,则抛出MultipleObjectResturned
get有且只能返回一个模型对象
一般用
filter(条件).first()来代替get
关于时间和日期的查询
- __year:根据年份查询
- __month:根据月份查询
- __day:根据天查询
- __hour:根据小时查询
- __minute:根据分钟查询
- __second:根据秒查询
- __week:根据第几周查询
- __week_day:根据星期查询 1代表周日 7代表周六
Django内置的模型类User
常见的方法有:
create_user:创建普通用户,会对密码进行加密
create_superuser:创建超级用户,会对密码进行加密
set_password:对密码进行加密
User模型的扩展
如果User模型中的字段不够,可以通过关联关系的方式进行扩增
自定义模型,通过OneToOneField
- 如果只有一张用户表,扩展方式为:
自定义一个模型,继承AbstractUser类,在自己的模型中定义额外的字段,需要在settings.py文件中农进行配置AUTH_USER_MODEL
设置为自己的模型,重新迁移
高级查询
from django.db.models import F导入F
在查询中使用字段名
例:
UserScore.objects.filter(pk=1).update(score=F("score")+20) # F对象主要引用模型的属性,可以对属性进行运算 # F对象支持排序,F对象里面有2个方法,asc, desc,支持空值的排序规则 # nulls_first = False 代表空数据出现在尾部 # nulls_last = False 代表空数据出现在头部
django.db.models import Value User.objects.filter(password = Func(Value("123"), function = "md5") Func(express, function)
相关文章推荐
- Django学习记录(11)Django静态资源操作
- django学习记录-模型继承
- 四十三、python学习之Django框架(三):数据库,数据库配置,定义模型,shell工具,数据库操作,查询集
- Django学习之模型的操作详解
- django学习笔记003-通过模型类操作数据库
- django学习记录--在admin界面进行搜索操作后,报错:Related Field got invalid lookup: icontains
- Django学习记录--Django模型管理器类的使用
- Django框架学习 — 7.5模型详解 -- 增删改操作
- django学习记录-django-1.5中简单地自定义自己的用户模型
- django模型manager学习记录
- django 学习-7 模型数据操作
- C#学习中记录(二)--------数据库的连接操作
- python django学习-问题记录及解决方法
- 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作
- awk实例操作学习记录
- redis学习记录(redis的持久化操作、基于java的jedis操作)
- 数据结构学习记录(三)链表的定义和操作
- ThinkPHP学习笔记(五)使用模型操作数据库之CURD
- Android学习记录——常用ADB操作指令
- Django学习笔记3-数据库操作