Reputation: 367
I defined several Django models and need to process the field value like the following, the codes are so redundant
version = 'xxxx'
version_objs = AP_Release_Version.objects.filter(ap_version__icontains=version)
for version_obj in version_objs:
version_value = version_obj.ap_version
......
version_objs = CP_Release_Version.objects.filter(cp_version__icontains=version)
for version_obj in version_objs:
version_value = version_obj.cp_version
......
version_objs = GPS_Release_Version.objects.filter(gps_version__icontains=version)
for version_obj in version_objs:
version_value = version_obj.gps_version
......
Is there any way to optimize the code like define the mapping info? thanks
map_info = {
'ap_version' : 'AP_Release_Version',
'cp_version' : 'CP_Release_Version',
'gps_version' : 'GPS_Release_Version',
}
Then I can do like this:
for key in map_info:
version_objs = map_info['key'].objects.filter(key__icontains=version)
for version_obj in version_objs:
version_value = version_obj.key
Upvotes: 0
Views: 50
Reputation: 15290
It seems like you have three variables: the object, the icontains, and the attribute. So create a list of tuples:
import collections
VersionInfo = collections.namedtuple('VersionInfo', 'obj icontains attrname')
Vinfos = [
VersionInfo(AP_Release_Version, 'ap_version__icontains', 'ap_version'),
VersionInfo(CP_Release_Version, 'cp_version__icontains', 'cp_version'),
VersionInfo(GPS_Release_Version, 'gps_version__icontains', 'gps_version'),
]
for vinfo in Vinfos:
kwargs = {vinfo.icontains : version }
version_objs = vinfo.obj.objects.filter(**kwargs)
for version_obj in version_objs:
version_value = getattr(version_obj, vinfo.attrname)
...
Upvotes: 1
Reputation: 155
have an idea, using kwargs:
map_info = {
'ap_version' : AP_Release_Version,
'cp_version' : CP_Release_Version,
'gps_version' : GPS_Release_Version,
}
for k, v in map_info.items():
version_objs = v.objects.filter(**{'%s_icontains' %k : version})
for version_obj in version_objs:
version_value = version_obj.key
Upvotes: 1