Python 有没有办法重构这两个函数?德扬戈

Python 有没有办法重构这两个函数?德扬戈,python,django,function,refactoring,reusability,Python,Django,Function,Refactoring,Reusability,我想我已经用了相当多的时间来呈现查询中的信息。我想知道是否有办法重构它们 这些代码的示例包括 def render_objA(self, objAs): output = [] for obj in objAs: output.append({ 'id': obj.id, 'name': obj.name 'description': obj.description,

我想我已经用了相当多的时间来呈现查询中的信息。我想知道是否有办法重构它们

这些代码的示例包括

def render_objA(self, objAs):
    output = []
    for obj in objAs:
        output.append({
            'id': obj.id,
            'name': obj.name
            'description': obj.description,
            'createdAt': obj.created,
            'modifiedAt': obj.modified
        })
    return output


def render_objB(self, objBs):
    output = []
    for obj in objBs:
        output.append({
            'id': obj.id,
            'name': obj.name,
            'content': obj.content,
            'createdAt': obj.created,
            'modifiedAt': obj.modified
        })
    return output


def render_objC(self, objCs):
    output = []
    for obj in objCs:
        output.append({
            'id': obj.id,
            'first_name': obj.first_name,
            'last_name': obj.last_name,
            'full_name': obj.full_name,
            'createdAt': obj.created,
            'modifiedAt': obj.modified
        })
    return output
一些输出可能比其他输出有更多的字段,当然也有不同的字段名。这要看情况而定

唯一相似且肯定相同的字段是
createdAt
modifiedAt

有人能给我一个主意或者告诉我怎么做吗


提前感谢

不确定这是好是坏,但您可以创建密钥映射。它可能会降低可读性,但会减少代码长度

key_mapping = {
    'created': 'createdAt',
    'modified': 'modifiedAt',
}
def create_dic(self, obj, key_list):
    dic = {}
    for k in key_list:
       v = getattr(obj, k, None)
       key = key_mapping.get(k, k)
       if v is not None:
           dic[key] = v
    return dic

def render_objA(self, objAs):
    key_list = ['id', 'name', 'description', 'created', 'modified']
    return [create_dic(obj, key_list) for obj in objAs]

def render_objB(self, objBs):
    key_list = ['id', 'name', 'content', 'created', 'modified']
    return [create_dic(obj, key_list) for obj in objBs]

def render_objC(self, objCs):
    key_list = ['id', 'name', 'first_name', 'last_name', 'full_name', 'created', 'modified']
    return [create_dic(obj, key_list) for obj in objCs]

我不确定您是否正在尝试渲染对象的所有字段,但如果是,您可以这样做。将这段代码添加到模型中

def __iter__(self):
    for field_name in self._meta.get_all_field_names():
        value = getattr(self, field_name, None)
        yield (field_name, value)
然后你的渲染方法就是这样

def render_obj(self, myobjs):
    output = []
    for obj in myobjs:
        dict = {}
        for field, val in obj:
            dict[field] = val 
        output.append(dict)
    return output

您应该在所有类上都有一个从对象创建dict的方法。然后,您可以在任何类型上使用您的方法。更不用说重构了。我的问题是这个代码首先应该做什么?它看起来很像。