2017-05-20 43 views
-1

我想我已經使用這個很多來呈現來自查詢的信息。我想知道是否有方法來重構它們?代碼的有沒有辦法重構這兩個函數? django

例子是

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

有人可以給我一個想法或讓我知道怎麼樣?

在此先感謝

+0

你應該有一個方法在你所有的類上創建一個對象的字典。然後你可以在你的任何類型上使用你的方法。 –

+0

不要介意重構。我的問題是這個代碼應該首先做什麼?它看起來最像undjango。 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – e4c5

回答

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] 
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