您的位置:首页 > 编程语言 > Go语言

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: