简介
本文主要整理了Django支持的多种复杂条件筛选数据库数据集的方法,同时属于上篇推文的拓展版,感兴趣的大兄弟们可以戳进去看看:django多种查询筛选数据库方式_Sean_TS_Wang的博客-CSDN博客
目录
三、rest-framework提供的SearchFilter
正文
本质上来说所有的多条件筛选方式最终都会转化成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判断一下,有些麻烦,可以写个循环