django是一个强大的免费的python框架,最近在学习中发现了一个问题,就是我需要按照一个字段查询信息时候使用get返回异常,如图所示:
查询资料后了解到django的get方法是从数据库中去的一个匹配的结果,如果匹配到多条记录他会报错。就是上面图片红色笔记出来的。
现在把django的数据查询最常用的两个方法get()和filter()的不同整理出来,以供大家参考。
一、django中的get()方法:
django的get()方法是从数据库中查询出一条匹配的记录,返回一个对象,如果没有匹配到的话,就会报出错误。如图所示:
就是某个字段没有匹配到记录。举个例子,假如我们有个学生的类,代码如下:
class Student(models.Model):
name = models.CharField('姓名', max_length=15)
age = models.IntegerField('年龄')
里面有两条记录为:学生A,10;第二条记录:学生B,10; 我们查询用Student.objects.get(name='学生C'),因为这条记录不存在,就会报上面的错误。
如果get()查询匹配到两条记录,比如我们用Student.objects.get(age=10)来查询,就会报另外一个错误,就是上面的第一张图的错误,"return more then one".
二、django的filter()方法:
django中的filter()方法是从数据库中缺的所有的匹配几句,返回一个对象列表,如果没有匹配到的话,返回[]空列表。还用上面的案例Student.objects.filter(age=10),
返回的是一个包含两条记录的列表。
三、在一对多关系中,如果用get取得关联表中返回的是多个数据。不会报错。
四、filter具有缓存功能,第一次查询后会生成缓存,下次调用的话,直接读取缓存数据,大大调高速度,而get()方法每次执行都是直接查询数据库的。