1. 类名.objects中的get(), filter(), all() 的区别
结论:
(1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。
例如有Book表,其包含bookname,booknum两个属性, 如何使用Objects.all(),得到bookname和booknum的值
For b in Book.objects.all(): Print(b.bookname, b.booknum)
(2)filter() 返回的是QuerySet对象,与all()相似,只是all()是查询所有数据,常用:filter表示‘ = ’,exclude表示’ != ’。
(3)get()返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据。
例:
下面定义两个模型类,分别为BookInfo, HeroInfo, BookInfo与HeroInfo为一对多的关系,代码如下:
from django.db import models class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager,self).get_queryset().filter(isDelete=False) def create(self, btitle, bpub_date): b = BookInfo() b.btitle = btitle b.bpub_date = bpub_date b.bread = 0 b.bcommet = 0 b.isDelete = False return b class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField() bread = models.IntegerField(default=0) bcommet = models.IntegerField(default=0) isDelete = models.BooleanField(default=False) class Meta: db_table = 'bookinfo' # 此处不定义表名的话,默认表名为应用名+模型类名(小写) books1 = models.Manager() books2 = BookInfoManager() class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField(default=False) isDelete = models.BooleanField(default=True) hcontent = models.CharField(max_length=100) hbook = models.ForeignKey(BookInfo) class Meta: db_table = 'heroinfo'
插入数据后的表格为:
bookinfo:
heroinfo:
查看 类名.objects中的get(), filter(), all() 得到的结果是什么,如下
通过type(),查看它们的类型
可以看出,通过get()查询,返回的结果为模型类对象,使用get方法会直接执行sql语句获取数据(不可迭代),而filter()以及all()返回的结果为查询集(QuerySet)对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。
2. 涉及外键的一些查询记录:
(1)查询涉及外键的属性时,得到的结果为外键所关联的模型类,如下图(查询HeroInfo的hbook属性,得到的是BookInfo模型类)
(2)知道外键关联的一个模型类(列表中的一行数据),可查出所有与此模型类关联的所有模型类,如 知道id为1
的book,可以通过HeroInfo.objects.filter(hbook=book)查出id为1的book所包含的所有英雄信息