首先肯定不能使用排列组合的方法,一个个去组合然后去if…else判断查询,下面介绍一个用法:
username = request.POST.get('username')
staff_num = request.POST.get('staff_num')
department = request.POST.getlist('department')
email = request.POST.get('email')
search = dict()
if username:
search['username'] = username
if staff_num:
search['staff_num'] = staff_num
if email:
search['email'] = email
if not department:
department = False
以上方法构造出一个条件查询的dict,在ORM查询中这样使用:
user = User.objects.filter(**search).values('staff_num', 'username', 'department', 'email', 'mobile_phone', 'office_telephone','lab_telephone')
注意在filter的参数位置,使用了**search
,这样就可以将每一个查询条件动态的去嵌入到查询中了。
如果想要在查询字段中做一些限制,比如使用__contains
,这是需要在search字典中的键中添加,例如:search['username__contains']
,构造之后的代码:
username = request.POST.get('username')
staff_num = request.POST.get('staff_num')
department = request.POST.getlist('department')
email = request.POST.get('email')
search = dict()
if username:
search['username__contains'] = username
if staff_num:
search['staff_num__contains'] = staff_num
if email:
search['email__contains'] = email
if not department:
department = False
user = User.objects.filter(**search).values('staff_num', 'username', 'department', 'email', 'mobile_phone', 'office_telephone','lab_telephone')
Django ORM不定项条件查询使用场景在项目中,经常会遇到不定项查询,多个表单中,用户随机选择一个或多个表单进行数据查询,那么在后台处理时,需要怎么处理这些不定项的查询呢?思路分析首先肯定不能使用排列组合的方法,一个个去组合然后去if…else判断查询,下面介绍一个用法:实现过程username = request.POST.get('username')staff_num = request.POST.get('staff_num')department = request.POST
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64, null=False, unique=True)
def __str__(self):
return "<Publisher>".format(self.name)
class Book(models.Model):
平常用ORM大部分使用的是get、filter、exclude这三种能满足基本的需求,有时我们需要满足一些复杂的查询场景,在页面上传不同参数满足查询需求。
ORM 条件查询使用field__结合 condition 的方式来使用的,比如查询包含指定的字符,可以用contains和icontains。
contains和icontains 区别
比如有下面这张表
MyDjango>python manage.py shell
>>> Product.objects.filter
来获取随机记录序列,性能不会比
sample = random.sample(xrange(Record.objects.count()),n)
result = [Record.objects.all()[i]) for i in sample]
filter(查询条件)
查询表中满足条件的所有数据 eg:Model.objects.filter(name=‘张三’) 查询所有name等于’张三’的数据具体查询条件下方另行介绍
exclude(查询条件)
与filter()逻辑相反。查询表中满足条件之外的所有数
# 获取查询条件
start_date = request.POST.get("start_date")
end_date = request.POST.get("end_date")
order_type = request.POST.get("order_type")
order_nature = request.POST.get("order_nature")
# 定义存储查询条件的字典
search_dict =
1. 使用缓存:使用 Django 的缓存系统可以大大提高查询的速度。
2. 使用预读:使用 select_related 和 prefetch_related 可以减少额外的查询次数,从而提高效率。
3. 避免 N + 1 查询问题:N + 1 查询是指在遍历每一个数据对象时需要进行一次额外的数据库查询。可以通过使用 select_related 和 prefetch_related 来避免这种情况。
4. 避免使用不必要的查询:在实际使用中,可能会有一些不必要的查询。避免这种情况可以提高效率。
5. 合理使用索引:为经常查询的字段创建索引可以提高查询的速度。
以上是一些常见的 Django ORM 优化方法,不同的场景可能需要采取不同的方法,希望这些建议能帮助您优化代码。