进入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=\'[email protected]\',birth=\'1990-08-19\',tel=\'123456\',sex=\'m\')stu.save()
方式二:
# 模型管理器对象来新增数据 create方法返回一个模型对象# 类名.objects.create()Student.objects.create(name=\'张三\',email=\'[email protected]\',birth=\'1990-08-19\',tel=\'123456\',sex=\'m\')
模型中数据的修改
方式一:
student = Student(id=\'3\',name=\'张三\',email=\'[email protected]\',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 QStudent.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 ValueUser.objects.filter(password = Func(Value(\"123\"), function = \"md5\")Func(express, function)