2017-05-20 3 views
-1

Ich dachte, dass ich das ziemlich viel benutzt habe, um Informationen von einer Frage zu rendern. Ich frage mich, ob es eine Möglichkeit gibt, sie umzugestalten?gibt es eine Möglichkeit, diese beiden Funktionen zu refaktorieren? django

Beispiele für die Codes sind

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 

Einige Ausgabe mehr Felder als andere und auch natürlich anderen Feldnamen haben könnte. Das hängt wirklich davon ab.

Die einzige ähnliche und sicher Felder werden die gleichen sein die createdAt und modifiedAt

Kann mir jemand eine Idee geben, oder lassen Sie mich wissen, wie?

Vielen Dank im Voraus

+0

Sie sollten eine Methode für alle Klassen haben, um die Dicts von einem Objekt zu erstellen. Dann können Sie Ihre Methode für jeden Ihrer Typen verwenden. –

+0

Egal Refactoring. Meine Frage ist, was soll dieser Code überhaupt tun? Es sieht fast wiejango aus. https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – e4c5

Antwort

0

nicht sicher, ob dies besser oder Schlimmste ist, aber Sie können einen Schlüssel-Mapping erstellen. Dies kann die Lesbarkeit verringern, aber die Codelänge verringern.

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

Ich bin mir nicht sicher, ob Sie versuchen, alle Felder eines Objekts zu machen oder nicht, aber wenn Sie sind, können Sie etwas tun. Dieses Stück Code zu den Modellen

def __iter__(self): 
    for field_name in self._meta.get_all_field_names(): 
     value = getattr(self, field_name, None) 
     yield (field_name, value) 

und dann machen Methoden etwas so sein würde.

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