django的各种查询

以一个学生类为例:

class Student(models.Model):

     id= models.FloatField(primary_key=True,related_name='blog')
     name= models.CharField(max_length=20, blank=True, null=True)
     age=models.FloatField(blank=True, null=True) 

     class Meta:
        managed = False
        db_table = 'student'

class Blog(models.Model):

    name = models.CharField(max_length=100)

    tagline = models.TextField()

    student=models.ForeignKey(Student)

1.基础查询:

 Student.objects.all();查询全部(Object是你要查的表对应的model名,后面是Django语法)

相当于 " select * from  student"

 Object.objects.filter(过滤条件);filter里面的内容相当于sql语句where后面的过滤条件,多个过滤条件用逗号隔开,相当于sql中的'and'

     过滤条件有:=  等值过滤     eg:id=1 

                         select ......... where id=1 

                         __lt  小于(双下划线,下同)    eg: age__lt='18

                          __lte 小于等于

                          __gt 大于

                          __gte 大于等于

                          __in  相当于sql语句的in eg: id__in=id_list(id列表)

                          __contains 模糊查询 相当于 like ‘%abc%’ 

                          __iexact 精确等于 忽略大小写 ilike ‘abc’

不等于(或not in):

如果要查询某个字段的值不等于某值或者是not in,Django提供了exclude(汉译:排除)方法

eg:查询id!=1的数据 ——Student.objects.all().execute(id=1)

      select ........ where id!=1        

查询id not in(1,2,3,4)——id_list=[1,2,3,4] Student.objects.all().execute(id__in=id_list)

     select ........ where id not in(1,2,3,4)

排序:

django提供了order_by来指定字段给查询结果排序(默认是升序)

eg: Student.objects.all().order_by('id')

       select * from student order by id asc

降序排列:order_by('-id')

查询某几个字段:

eg:Student.objects.values('id','name','age').order_by('id')

 select id,name,age from student order by id

通过values()方法查询到的结果集是一个QuerySet,里面存的是字典,而查询全部字段得到结果集是QuerySet里面存的是一个个object对象。

or查询:

from django.db.models import Q

eg:查询id是1或age<18的学生:

Student.objects.filter(Q(age__lt=18)|Q(id=1))

分页查询(相当于limit):   不支持负索引

Student.objects.all()[:5] 查询前5行数据

Student.objects.all()[5:10] 查询6到10行数据

2.聚合查询(count/avg/max/min/sum等)

使用django提供的aggregate(聚合函数)

eg:查询学生数:

from django.db.models import Count

Student.objects.all().aggregate(num=Count('id')) 指定列名为num

分组查询:

 Student.objects.filter('age').annotate(Count('id'))

3.多表查询

通过外键查询关联对象:

       b = Blog.objects.get(id=2)

      b.student()

过滤字段为关联表字段时用"__"双下划线(两个下划线可以生成连接查询,查询关联的字段信息):

    b=Blog.objects.filter(student__age>18)

查询字段也可以是关联表字段:

    b=Blog.objects.filter(student__age>18).values('name','student__name')

    查询结果为学生名字和博客名字

反向查询 (主键类访问外键类):

 

    s = Student.objects.get(id=1)

    s.blog.all()  #这么查询,必须在外键里面加上related_name属性,blog为related_name的值

转载于:https://my.oschina.net/u/3420568/blog/1605547

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django一个流行的Python Web框架,它提供了许多功能来简化数据库操作和查询。在Django中,你可以使用ORM(对象关系映射)来查询数据库。ORM允许你将数据模型与数据库表分开,从而使得数据库操作更加灵活和易于管理。 Django提供了许多内置的数据库查询工具,包括以下几种: 1. 查询构建器:Django提供了强大的查询构建器,允许你使用SQL语句来构建查询。你可以使用`QuerySet`对象来构建查询,它提供了许多方法来过滤、排序、分组和连接数据。 2. 过滤器:Django查询构建器支持各种过滤器,例如`filter()`、`exclude()`、`order_by()`等,这些方法允许你根据条件对数据进行筛选和排序。 3. 关联查询Django支持关联查询,可以方便地查询多个表之间的关联数据。你可以使用`select_related()`、`prefetch_related()`等方法来执行关联查询,以提高性能和减少数据库交互次数。 4. 聚合查询Django查询构建器还支持聚合查询,可以用于计算总和、平均、计数等统计信息。你可以使用`annotate()`、`aggregate()`等方法来进行聚合查询。 5. 数据库迁移:Django提供了数据库迁移工具,可以帮助你在开发过程中轻松地更新数据库结构。你可以使用`makemigrations`和`migrate`命令来创建和执行迁移文件,以更新数据库结构。 下面是一个简单的示例,展示了如何在Django中使用查询构建器和过滤器进行数据库查询: ```python from myapp.models import MyModel # 获取所有满足条件的模型实例 queryset = MyModel.objects.filter(status=1) # 按照指定字段排序 queryset = queryset.order_by('created_at') # 获取指定字段的总数 total = queryset.count() ``` 这只是一些基本的介绍,Django还提供了更多高级的查询功能和工具,可以根据具体需求进行学习和使用。你可以参考Django官方文档和教程,以获取更多关于数据库查询的详细信息和示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值