我认为我一直在使用它来渲染查询中的信息。我想知道是否有办法重构它们?
代码的例子是
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
有人可以给我一个想法或让我知道怎么做?
提前致谢
答案 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