Django查询及双下划线方法和一对多外键关系的ORM操作

一、models对象常用的方法

1、all()  

2、filter(**kwargs)    

3、get(**kwargs) 

4、exclude(**kwargs)  

5、values(*field) 

6、values_list(*field)  

7、order_by(*field)  

8、reverse() 

9、count()  

10、first()   

11、last()  

12、exists()   

二、双下划线使用

1、xx__lt    小于

2、xx__gt    大于

3、xx__lte    小于等于

4、xx__gte    大于等于

5、xx__in    包含某些值

6、exclude(age__in=[11,32])  不包含

7、 xx__contains()   (包含某个字符的记录)和xx__icontains()   (忽略大小写的包含)

8、xx__range     查找范围

9、xx__startwith  (获取以xx开头的记录) xx__istartwith(获取以xx开头的记录,忽略大小写)

10、xx__endwith( 获取以xx结尾的记录) xx__iendwith(获取以xx结尾的记录,忽略大小写)

11、 xx__date  可以根据年月日进行过滤

三、一对多关系

(一)查询

1、正向查询  查询对应学科

2、反向查询  查询学Python的学员

(二)增加

1、正向增加

2、反向增加

(三)删除

(四)修改

1、正向修改

2、反向修改


一、models对象常用的方法

1、all()  

查询所有结果  QuerySet对象,输出结果的数据类型是一个列表类型,列表中的元素对应每一行的元素

2、filter(**kwargs)    

包含所有筛选条件符合的对象 输出结果的数据类型是一个列表类型,列表中的元素对应每一行的元素

3、get(**kwargs) 

返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

4、exclude(**kwargs)  

它包含了与所给筛选条件不匹配的对象  返回的是一个QuerySet对象,是一个列表,列表内部是对应的每行元素的对象

5、values(*field) 

返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列  返回的是一个QuerySet对象,是一个列表,列表中嵌套的的是行元素组成的字典

6、values_list(*field)  

它与values()非常相似,它返回的是一个元组序列,返回的是一个QuerySet对象,是一个列表,列表中嵌套的的是行元素中的值,每个值组成的元组形式

7、order_by(*field)  

对查询结果排序 返回的是一个QuerySet对象,是一个列表,列表中嵌套的是排序后的结果对象

8、reverse() 

对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。返回的是一个QuerySet对象,是一个列表,列表中嵌套的是排序后的结果对象

9、count()  

返回数据库中匹配查询(QuerySet)的对象数量,是一个int类型

10、first()   

返回第一条记录,返回结果是一个对象

11、last()  

返回最后一条记录,返回结果是一个对象

当输出结果为空时,first和last方法可以返回空,但若对其进行索引调用则会出现报错情况

12、exists()   

如果QuerySet包含数据,就返回True,否则返回False 输出为boolean类型,不需要使用参数

二、双下划线使用

1、xx__lt    小于

xx__lt    小于

2、xx__gt    大于

xx__gt    大于

3、xx__lte    小于等于

xx__lte    小于等于

4、xx__gte    大于等于

xx__gte    大于等于

5、xx__in    包含某些值

ret = person_model.filter(age__in=[12,22])

6、exclude(age__in=[11,32])  不包含

exclude(age__in=[11,32])  不包含

7、 xx__contains()   (包含某个字符的记录)和xx__icontains()   (忽略大小写的包含)

xx__contains()   包含某个字符的记录


xx__icontains()   忽略大小写的包含

8、xx__range     查找范围

xx__range     查找范围

9、xx__startwith  (获取以xx开头的记录) xx__istartwith(获取以xx开头的记录,忽略大小写)

ret = person_model.filter(name__startwith='t')

ret = person_model.filter(name__istartwith='t')

10、xx__endwith( 获取以xx结尾的记录) xx__iendwith(获取以xx结尾的记录,忽略大小写)

ret = person_model.filter(name__endwith='t')

ret = person_model.filter(name__iendwith='t')

11、 xx__date  可以根据年月日进行过滤

ret = person_model.filter(birthday__year=2019)

注:返回的所有结果均是列表形式,列表元素是查找到的结果的详细信息

三、一对多关系

(一)查询

1、正向查询  查询对应学科

student_obj = models.Student.objects.get(name = 'zs')
subiect_obj = models.Subiect.objects.get(id=student_obj.subject_id)

#或者
subiect_obj = student_obj.subject   #返回一个对象

2、反向查询  查询学Python的学员

sub = models.Subject.objects.get(name="python")
stu = sub.student_set.all() # 默认使用 类名小写_set 属性进行关联

(二)增加

1、正向增加

##方法一
sub = models.Subject.objects.get(name='java')
stu = models.Student()
stu.name = '钩子'
stu.subject_id = sub.id
stu.save()

##方法二
stu = models.Student.objects.create(
    name = 'lianzi',
    subject = sub
)

2、反向增加

java学科新增一个学员
sub = models.Subject.objects.get(name='java')
sub.student_set.create(name='Lianzi')

(三)删除

models.Student.objects.get(name='钩子').delete()

models.Student.objects.filter(name__contains='子').delete()

# java科目毕业 级联删除学员
models.Subject.objects.get(name='java').delete()

(四)修改

1、正向修改

##方法一
# zs转学java
sub = models.Subject.objects.get(name='java')
stu = models.Student.objects.get(name='zs')
stu.subject = sub
stu.save()

##方法二
sub = models.Subject.objects.get(name='java')
models.Student.objects.filter(name='zs').update(subject=sub)



2、反向修改

sub = models.Subject.objects.get(name='java')
stu1 = models.Student.objects.get(name='zs')
stu2 = models.Student.objects.get(name='ls')

sub.student_set.set([stu1,stu2])






猜你喜欢

转载自blog.csdn.net/qq_40576301/article/details/100566999
今日推荐