有没有办法重构这两个函数? Django的

时间:2017-05-20 01:33:59

标签: 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,
            '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

某些输出可能包含的字段多于其他输出,当然也有不同的字段名称。这实际上取决于。

createdAtmodifiedAt

唯一相似且肯定的字段相同

有人可以给我一个想法或让我知道怎么做?

提前致谢

2 个答案:

答案 0 :(得分:0)

不确定这是好还是坏,但你可以创建一个键映射。它可能会降低可读性但会减少代码长度。

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]

答案 1 :(得分:0)

我不确定您是否尝试渲染对象的所有字段,但如果您是,则可以执行此类操作。将这段代码添加到模型中

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