Django实现多条件查询数据库的多种方式

简介

本文主要整理了Django支持的多种复杂条件筛选数据库数据集的方法,同时属于上篇推文的拓展版,感兴趣的大兄弟们可以戳进去看看:django多种查询筛选数据库方式_Sean_TS_Wang的博客-CSDN博客


目录

简介

目录

正文

一、使用原生SQL实现多条件筛选(extra)

二、Django ORM 实现多条件筛选

简单筛选

Q方法

三、rest-framework提供的SearchFilter

四、django-filter

五、自定义筛选方式

总结


正文

本质上来说所有的多条件筛选方式最终都会转化成SQL语句进行操作,但是Django提供了多种方式,简化对数据库筛选操作。

一、使用原生SQL实现多条件筛选(extra)

上篇推文提到几种方式使用原生SQL操作数据库,这次使用extra做例子讲解,实际上效果是差不多的。

from django.db import models

class user(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=5)
    age = models.IntegerField()

    class Meta:
        db_table='user'

class animal(model.Model):
    kind = models.CharField(primary_key=True, max_length=5)
    name = models.CharField(max_length=5)
    sex = models.BooleanField()

    class Meta:
        db_table='animal'



# select user.id,user.name,user.age from user, animal where user.name=animal and user.age>18
User = User.objects.all().extra(tables=['animal'], 
                                where=[
                                    'user.name = animal.name',
                                    'user.age > 18'
                                    ]
                                )

优点:支持多表筛选,同时更符合数据库查询,甚至可以使用数据库函数简化查询

缺点:老问题,SQL注入。如何防止SQL注入的方法在上篇推文里面有写,基本思路就是对传过来的参数不要直接拼接到SQL语句中 ,而是先经过自己的排序处理再安装在相应的位置。 


二、Django ORM 实现多条件筛选

简单筛选

基本筛选

from django.db import models
from django.core import serializers
from django.Response import JSONResponse

class user(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=5)
    age = models.IntegerField()

    class Meta:
        db_table='user'


def userView(request):
    queryset = user.objects.all()
    id = request.GET.get('id',None)
    name = request.GET.get('name',None)
    age = request.GET.get('age',None)
    
    if id:
        queryset = queryset.filter(id=id)
    if name:
        queryset = queryset.filter(name=name)
    if age:
        queryset = queryset.filter(age=age)
    queryset = serializers.serializer('json',queryset)
    return JSONResponse({'data':queryset})
        

        

这样每个字段都需要if判断一下,有些麻烦,可以写个循环

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值