django中的filter(), all(), get()

Posted jj1106

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django中的filter(), all(), get()相关的知识,希望对你有一定的参考价值。

1. 类名.objects中的get(), filter(), all() 的区别

下面定义两个模型类,分别为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模型类)

技术图片

 

以上是关于django中的filter(), all(), get()的主要内容,如果未能解决你的问题,请参考以下文章

Django Models .get 失败,但 .filter 和 .all 有效 - 对象存在于数据库中

使用 Extra 和 Filter 的 Django OR 查询

Django 视图中的原始 SQL 查询

经验分享Django开发中常用到的数据库操作总结

django 学习笔记

django objects.all 怎么选择数据