【发布时间】:2017-02-28 15:21:51
【问题描述】:
我写了一个查询具有已知查找类型的模型。表示作为kwargs 传递的输入类型的标志。 kwarg 查找与传递的 kwargs 解释如下。
- 一个数据库散列(随机的非实例唯一性,
db_hash=True) - 对象名称(“John”或“Sam”为
name=True) - 对象的 ID。 (obj.ids
124,或134为id=True) - 实例(不带任何标志的 obj)
例如,仅用于方法调用的名称,
self.check_all_routes("Sam", "452", name=True)
我想重构下面的方法来减少它在违反 DRY 时产生的混乱。
def check_all_routes(self, driver, route, **kwargs):
_hash = kwargs.get('db_hash')
_name = kwargs.get('name')
_id = kwargs.get('id')
if _hash:
return self.model.objects.filter(
driver__db_hash=driver,
route__db_hash=route
).prefetch_related().select_related().values_list('route_number')
if _name:
return self.model.objects.filter(
driver__name=driver,
route__name=route
).prefetch_related().select_related().values_list('route_number')
if _id:
return self.model.objects.filter(
driver_id=driver,
route_id=route
).prefetch_related().select_related().values_list('route_number')
return self.model.objects.filter(
driver=driver,
route=route
).prefetch_related().select_related().values_list('route_number')
可以做些什么来使它不违反 DRY。
【问题讨论】:
-
只能有一个是真的吗?
标签: python django refactoring django-queryset dry