Django中数据对象的增删改查常用方法,自定义管理器类,过滤器及F和Q对象等知识点总结

Django对象的增删改查

我们为了对django对象的增删改查进行总结,先在model.py文件中创建类便于举例

定义学生:

class Students(models.Model):
	sname=models.CharField(max_length=20)
	sgender=models.BooleanField(default=True)
	sage=models.IntegerField()
	sscord=models.CharField(max_length=20)
	isDelete=models.BooleanField(default=False)
	# 这里可以添加Meta类进行对元类的重命名和排序操作
	class Meta:
		db_table=xxx  # 定义数据表名,推荐使用小写字母
		ordering=[]   # 对象的默认排序字段 ,获取对象列表时使用,通常是Integer(整数)类型,升序ordering['id'],降序用ordering['-id']

然后在url.py文件中添加一个链接转到views.py文件中:

url(r'^show/',views.show)

接下来在views.py文件中进行具体的增删改查操作
下面是一些例子:
查询:

# 类名.objects.all()   #查询所有对象
Students.objects.all()

# 类名.object.get('条件')   #查询单个对象
Students.object.get(sage=18)

# 类名.object.filter.(条件查询)  #模糊查询
#查询年龄小于等于18岁的学生信息
Student.objects.filter(age__lte=20).all()
#查询出年龄大于等于18岁的用户信息,但是使用的是exclude函数
Students.objects.exclude(age__gt=18).all()

# 查询结果集的数量
Students.objects.all().count()

# 判断查询结果集是否有值
Students.objects.all().exists()

# 使用切片的形式拿到前几个值
Students.objects.all()[0:3]

# 求出年龄大于学分的所有学生信息
# Student.object.filter(sage__gt=F('sscord')).all()

# 求出年龄大于20,并且姓名包含e的所有信息
Students.object.filter(sage__gt=20).filter(sname__contains='e').all()

修改:

# 排序  (默认升序,降序的话属性前面加‘-’)
Students.objects.order_by('sage')

#修改
得到对应的对象
模型对象.属性=属性值
模型对象.save()
stu=Students.object.get(sage=18)
stu.sage=19
stu.save()

删除:

获得对象名
对象名.delete()
stu = Students.objects.get(pk=1)
stu.delete()

增加:

对象.save
stu=Students()
sname=jeck
sage=18
sscord=60
stu.save()
context = {
        'stu':stu
    }
return render(request,'show.html',context=context)

最后在show.py文件里展示views.py文件中的内容
show.py

<ul>
    {% for i in stu %}
        <li>
            {{ i.sname }}
        </li>
    {% endfor %}
</ul>

上面只是一些大概的例子,下面进行总结:
--------------------------------------------------------------------------
ORM(Object Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
可以简单理解为翻译机,用于django与数据库交互
Django默认通过模型的‘objects’对象实现模型数据查询
Django有两种过滤器用于筛选记录:

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

返回查询集:

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

返回单个数据:

get():返回一个满足条件的对象,没有找到会引发模型类.DoesNotExist异常,找到多个会引发模型类.MultiObjectsReturned异常
first():返回查询集中的第一个对象
last():返回查询集的最后一个对象
count():返回当前查询集中的对象个数
exists():判断查询集中是否有数据,如果有返回True,反之返回False

限制查询集和查询集的缓存:

限制查询集可以使用下标的方法进行限制,等同于sql中的limit
studentList=Students.objects.all()[0:5]   #下标不能是负数
查询集的缓存:每个查询集都有一个缓存,来最小化对数据库的访问
在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,django会将查询出来的数据做一个缓存,并返回查询结构,以后查询直接使用查询集的缓存

过滤器filter(),exclude()以及get()的参数:

语法:属性名称_比较运算符=值

比较运算符:
exact:判断,大小写敏感,	filter(isDelete=False)
contains:是否包含,大小写敏感,	filter(sname_contains='赵')
startswith,endswith:以values开头或结尾,大小写敏感
在以上四个运算符前加上i(ignore)就不区分大小写了
isnull,isnotnull:是否为空,	filter(sname_isnull=False)
in:是否包含在范围内,filter(pk_in=[1,2,3,4])
gt,gte,lt,lte:大于,大于等于,小于,小于等于,	filter(sage_gt=30)

表示时间的:
year,month,day,week_day,hour,minute,second:
	filter(lasttime__year=2017)
pk:代表主键,filter(pk=1)

跨关系查询:
模型类名__属性名__比较运算符,实际上就是处理的数据库中的join
grade = Grade.objects.filter(student__scontend__contains='赵钱孙')
描述中带有'赵钱孙'这三个字的数据属于哪个班级

聚合函数:
使用aggregate()函数返回聚合函数的值
Avg:平均值
Count:数量
Max:最大
Min:最小
Sum:求和
Student.objects().aggregate(Max('sage'))

F对象:

可以使用模型的A属性与B属性进行比较
grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') )
F对象支持算数运算
grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') +10 )

Q对象:

过滤器的方法中的关键参数,常用于组合条件
年龄小于25
Student.objects.filter(Q(sage__lt=25))
Q对象语法支持  | (or), & (and), ~(取反)
年龄大于等于的
Student.objects.filter(~Q(sage__lt=25))

当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时才于数据库进行交互,将对象保存在数据库中
-------------------------------------------------------
在Django中,我们有些时候使用Django自带的ORM语句无法达到操作数据库的效果,这时,我们可以自定义一个管理器来进行数据库的操作。从总体上来说,就是重写方法和自定义方法

django的隐性属性和显性属性

显性: 自己写的那些
隐性: objects 是一个Manager类型的一个对象,作用于数据库进行交互

自定义模型管理器作用:

可以向管理器中添加额外的方法
修改管理器返回的原始查询集
提供创建对象的方式

不同的操作在不同的类中,如all() 在Manager类,get()在Query类中
一个例子说明自定义管理器类的作用:

通过Student.objects.all() 查询sgender为True的记录

class Student(models.Model):
    sno = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=30,null=False)
    sgender = models.BooleanField(default=False)
 
    objects = getAllTrue()  #创建一个自定义类对象
 
    def __str__(self):
        return "Student:%s--%s"%(self.sname,self.sgender)

#自定义管理类
class getAllTrue(models.Manager):  #all()来自于Manager类
    # def all(self):      #重写方法
    #     return Manager.all(self).filter(sgender = True) #功能操作
      def get_queryset(self):		# 与all() 方法相同,在源码中,all()执行就是调用get_queryset()方法。
    	  return Manager.get_queryset(self).filter(sgender=True)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值