浅谈Django中的filter用法与反向查询
Django中,filter()对象返回的是一个查询集QuerySet,可用于执行切片和遍历,可用于执行反向查询,与all()相似,只是all()查询全部对象,另一种查询函数是get(),get()只能获取唯一存在的对象,不存在对象或者是多个对象的情况下都会报错。
下面介绍反向查询的简单应用,先看一段代码:
class Person(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(default=0)
class Pen(models.Model):
num = models.IntegerField(default=0)
color = models.CharField(max_length=10)
pen = models.ForeignKey(Penson,on_delete=models.CASCADE)
在这段代码中,Pen中有一个外键字段,关联Person,Pen作为Penson的外键存在,正向查询就是有外键字段的表去查询关联的表,即Pen关联查询Person;
下面重点介绍反向查询:
反向查询是没有外键字段的表去关联查询有该表外键关联的表,即Person表关联查询Pen表;
反向查询的具体代码操作:
创建Person实例:
per = Person(name = ‘小明’, age = 20)
使用filter查询:
#此时返回的是一个查询集QuerySet, 也可使用get()查询
Person.objects.filter(id=1)
进行反向查询并创建Pen实例:
#创建Person实例
p = Person.objects.get(pk = 1)
#进行反向查询,此时pen_set为小写(首字母或者中间都要小写)
p.pen_set.all()
#通过Person创建pen实例
a=p.pen_set.create(num = 3,color = ‘红色’)
我们可以看到,进行反向查询时,在代码后面加上关联类名+_set,且类名小写,也可用filter查询单个的数据,即执行类似get()的功能,只是此时返回的是一个查询集。