简体   繁体   中英

How to optimize the code for this situation?

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

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

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)
        ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM