进入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)