day03-模型使用(数据库增删改查)

创建模型

models.py

class Student(models.Model):
    # Create your models here.

    name = models.CharField(max_length=10, unique=True)
    age = models.IntegerField(default=18)
    gender = models.BooleanField(default=1)
    # auto_now_add创建数据时,默认create_time字段为当前时间
    create_time = models.DateTimeField(auto_now_add=True, null=True)
    # 修改的时间,每次update学生信息时,修改改字段的时间为当前时间
    operate_time = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        # 指定Student模型映射到数据库中,对应的表名
        db_table = 'student'

生成迁移文件 python manage.py makemigrations
进行迁移 python manage.py migrate

在views.py下进行增删改查

方法1
stu = Student()
stu.name = '小明'
stu.save()


方法2
Student.objects.create(name='柯南')

student.objects.filter(name='柯南').delete()

更新

方法1
stus = Student.objects.filter(name='龙蟠路')
stu = stus[0]
方法2
stu = Student.objects.filter(name='龙蟠路').first()

stu.name = '小明'
stu.save()

方法3
Student.objects.filter(name='龙蟠路4图').update(name='莉哥')

查询(重点)

相关知识点介绍

1.模型成员objects

Django默认通过模型的objects对象实现模型数据查询

2.过滤器

查询集表示从数据库获取的对象集合
查询集可以有多个过滤器
过滤器就是一个函数,基于所给的参数限制查询的结果
从SQL角度来说,查询集合和select语句等价,过滤器就像where条件
Django有两种过滤器用于筛选记录

filter : 返回符合筛选条件的数据集
exclude : 返回不符合筛选条件的数据集
多个filter和exclude可以连接在一起查询

有以下过滤器

all() 返回所有数据
filter() 返回符合条件的数据
exclude() 过滤掉符合条件的数据
order_by() 排序
values() 一条数据就是一个字典,返回一个列表

3.查询单个数据

get():返回一个满足条件的对象。如果没有返回符合条件的对象,会应该模型类>DoesNotExist异常,如果找到多个,会引发模型类MultiObjectsReturned异常

first():返回查询集中的第一个对象

last():返回查询集中的最后一个对象

count():返回当前查询集中的对象个数

exists():判断查询集中是否有数据,如果有数据返回True,没有返回False

4.比较运算符

contains:是否包含,大小写敏感

startswith,endswith:以values开头或者结尾,大小写敏感 。
以上的运算符前加上i(ignore)就不区分大小写了。
isnull,isnotnull:是否为空。filter(name__isnull=True)

in:是否包含在范围内。filter(id__in=[1,2,3])

gt,gte,lt,lte:大于,大于等于,小于,小于等于。filter(age__gt=10)

pk:代表主键,也就是id。filter(pk=1)

5.聚合函数agregate()

函数返回聚合函数的值

Avg:平均值

Count:数量

Max:最大

Min:最小

Sum:求和

6.F对象/Q对象

F对象:可以使用模型的A属性与B属性进行比较
F对象支持算数运算

7.Q对象:

Q()对象就是为了将过滤条件组合起来
当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象
使用符号&或者|将多个Q()对象组合起来传递给filter(),exclude(),get()等函数
Q()对象的前面使用字符“~”来代表意义“非”

查询年龄是18岁的学生对象
stus = Student.objects.filter(age=18)

查询姓名是莉哥的学生对象的值
stus = Student.objects.filter(name='莉哥').values()
结果
{'id': 11, 
'name': '莉哥', 
'age': 18, 'gender': True,
'create_time': datetime.datetime(2018, 11, 27, 8, 3, 52, 141901, tzinfo=), 
'operate_time': datetime.datetime(2018, 11, 27, 8, 3, 52, 144904, tzinfo=)}


查询所有学生对象的值
stus_value = Student.objects.all().values()


查询所有学生对象的姓名
stus = Student.objects.all()
stu_names = [stu.name for stu in stus]

查询学生对象中的第一个
stus = Student.objects.all().first()

查询是叫莉哥的学生对象
#get()获得唯一一个满足条件的对象,且查询条件必须存在,不然会报错
stu = Student.objects.get(name='莉哥')


查询不是叫大明的学生对象
stus = Student.objects.exclude(name='大明')

查询年龄等于18岁而且名字是叫莉哥

stus =Student.objects.filter(age=18,name='莉哥')


通过学生对象的id(主键)排序
#-id是降序,id是升序
stus =Student.objects.all().order_by('-id')

查询姓名中包含莉的信息
contains  类似于like'%莉%'(大小写敏感)
stus =Student.objects.filter(name__contains='莉')

查询学生对象姓名中以莉结尾的
endswith  类似于like'%莉'
stus = Student.objects.filter(name__endswith='莉')

查询学生对象姓名中以莉开头的
startswith endswith  类似于like'莉%'
stus = Student.objects.filter(name__startswith='莉')

in 查询学生对象主键是1,2,11    
stus = Student.objects.filter(id__in=[1,2,11])

pk 查询学生对象主键是1,2,14  pk(主键)=id
stus = Student.objects.filter(pk__in=[1,2,14])

查询学生对象中年龄小于19岁的
大于,__gt   大于等于, __gte
小于,__lt  小于等于,__lte
stus = Student.objects.filter(age__lt=19)

聚合(aggregate)
查看学生对象平均年龄
stu_age = Student.objects.all().aggregate(Avg('age'))
查看学生对象总的年龄
sum_age = Student.objects.all().aggregate(Sum('age'))


Q对象
与   或   非

并且条件   查询年龄是18并是性别女生
stus = Student.objects.filter(Q(age=18), Q(gender=0))
stus = Student.objects.filter(Q(age=18) & Q(gender=0))

或者条件  查询年龄是18或是性别女生
stus = Student.objects.filter(Q(age=18)| Q(gender=0))

非条件   查询年龄不是18或是性别女生
stus = Student.objects.filter(~Q(age=18) | Q(gender=0))

F对象
查询语文成绩比数学成绩大的学生
socre = Student.objects.filter(chinese__gt=F('maths'))

查询语文成绩比数学成绩大9分的学生
socre = Student.objects.filter(chinese__gt=F('maths')+9)




'''
stu_names = [stu.name for stu in stus]列表推导式
相当于
stu.names=[]
for stu in stus:
      stu_names.append(stu.name)

 return HttpResponse(stu_names)
'''

你可能感兴趣的:(day03-模型使用(数据库增删改查))