from django.db.models import Q
# 获取查询参数
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
start_date2 = request.GET.get('start_date2')
end_date2 = request.GET.get('end_date2')
project_name = request.GET.get('title')
# 创建初始查询集
mymodel = ProjectModel.objects.using('company').all()
# 添加项目名称模糊查询条件
if project_name:
mymodel = mymodel.filter(project_name__icontains=project_name)
# 同时查询两个日期范围
if start_date and end_date and start_date2 and end_date2:
mymodel = mymodel.filter(
Q(contracted_time__range=(start_date, end_date)) &
Q(completion_time__range=(start_date2, end_date2))
)
# 查询第一个日期范围
elif start_date and end_date:
mymodel = mymodel.filter(contracted_time__range=(start_date, end_date))
# 查询第二个日期范围
elif start_date2 and end_date2:
mymodel = mymodel.filter(completion_time__range=(start_date2, end_date2))
这个写法有几个特点和优点:
-
模块化和可读性: 将查询过滤条件处理部分封装成一个独立的代码块,使得代码结构更加清晰和模块化。每个条件都有清晰的注释说明,提高了代码的可读性。
-
灵活性: 通过使用 Django 提供的 Q 对象,可以构建复杂的查询条件,例如同时查询两个日期范围,或者仅查询一个日期范围。这种灵活性使得代码能够适应不同的查询需求。
-
简洁性: 通过逐步添加查询条件,只在需要的情况下对查询集进行过滤,避免了重复代码和不必要的数据库查询。这种简洁的写法减少了代码量,提高了代码的可维护性。
-
可扩展性: 如果需要添加更多的查询条件,只需在相应的位置添加新的查询条件即可,而不需要修改整个查询逻辑。这种可扩展性使得代码更容易维护和扩展。
总的来说,这种写法使得查询过滤条件处理部分的代码更加清晰、简洁、灵活和可扩展,提高了代码的可读性和可维护性。