python - Django:如何使用 filter() 或不基于可选参数?
问题描述
正如您在此 url 中看到的,city
参数是可选的:
re_path(r'all/(?P<category>\w+)/(?P<page_num>\w+)/?/(?P<city>\d+)?', views.show_all_objects, name="show-all-objects")
视图.py:
def show_all_objects(request, category, page_num, city=''):
if category == 'restaurants':
objects = Item.objects.instance_of(Restaurant)
elif category == 'sportfitness':
objects = Item.objects.instance_of(SportFitness)
elif category == 'carservice':
objects = Item.objects.instance_of(CarService)
elif category == 'beautysalon':
objects = Item.objects.instance_of(BeautySalon)
elif category == 'fastfood':
objects = Item.objects.instance_of(FastFood)
elif category == 'carwash':
objects = Item.objects.instance_of(CarWash)
elif category == 'fun':
objects = Item.objects.instance_of(Fun)
elif category == 'other':
objects = Item.objects.instance_of(Other)
paginator = Paginator(objects, 2)
objects = paginator.get_page(page_num)
context = {
'objects': objects,
'category': category,
'page_num': page_num,
}
return render(request, 'show_all_objects.html', context)
我想如果 city 参数设置为 add .filter(city=city)
,我可以这样做,if/else
但它不遵循 DRY 原则。
解决方案
尝试使用字典来映射 instance_of 方法的参数。
def show_all_objects(request, category, page_num, city=''):
params_map = {
'restaurants': Restaurant,
'sportfitness': SportFitness,
'carservice': CarService,
'beautysalon': BeautySalon,
'fastfood': FastFood,
'carwash': CarWash,
'fun': Fun,
'other': Other,
}
objects = Item.objects.instance_of(params_map.get(category))
# If city is provided
if city:
objects = objects.filter(city=city)
paginator = Paginator(objects, 2)
objects = paginator.get_page(page_num)
context = {
'objects': objects,
'category': category,
'page_num': page_num,
}
return render(request, 'show_all_objects.html', context)
推荐阅读
- python - Pyinstallere EXE、PyQt WebEngineView \ WebEnginePage 从 GUI 中消失
- wpf - WPF - ItemsControl 的自定义样式
- javascript - 我可以使用 d3.js 从流程图创建 json 文件吗?
- c# - 当从文件夹运行进程时重命名/移动文件夹
- react-native - react-native-maps:animateToRegion 不适用于区域或初始区域?
- flutter - 为什么颤振本地通知会出现异常
- reactjs - Reactjs中,如何在项目中集成Cashfree UPI?
- vue.js - 单选后关闭多选下拉菜单
- parallel-processing - 使用 DataLoader 在工作人员之间手动拆分数据集
- reactjs - 我正在尝试使用 componentdidmount 功能