AI智能
改变未来

Django学习记录(9)Django中的模型操作


进入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)
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Django学习记录(9)Django中的模型操作