from itertools import chain import datetime from django.db.models.fields.related import ManyToManyField, ForeignKey, OneToOneField from django.core.files import File def model_to_dict(instance, fields=None, exclude=None): """ Return a dict containing the data in ``instance`` suitable for passing as a Form's ``initial`` keyword argument. ``fields`` is an optional list of field names. If provided, return only the named. ``exclude`` is an optional list of field names. If provided, exclude the named from the returned dict, even if they are listed in the ``fields`` argument. """ if instance == None: # 若果要是过来空的值,那就直接返回了 return opts = instance._meta data = {} for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many): # if not getattr(f, "editable", False): # continue print('看看F是啥:', f) if fields is not None and f.name not in fields: continue if exclude and f.name in exclude: continue # data[f.name] = f.value_from_object(instance) value = f.value_from_object(instance) if type(value) == datetime.datetime: value = value.strftime('%Y-%m-%d %H:%M:%S') elif type(value) == datetime.date: value = value.strftime('%Y-%m-%d ') elif type(f) == ForeignKey: # 展示外键关联表的数据 foreign_Key = getattr(instance, f.name) value = model_to_dict(foreign_Key) elif type(f) == OneToOneField: # 展示一对一关联表的数据 opneToOne_Field = getattr(instance, f.name) value = model_to_dict(opneToOne_Field) elif type(f) == ManyToManyField: # 展示多对多的 many_to_many__list = [model_to_dict(item) for item in value] value = many_to_many__list if isinstance(value, File): # /XXX/XXX/a.jpg 返回文件的路径 value = str(value) data[f.name] = value return data
Django中重写model_to_dict方法,兼容接口返回展示时间和外键的
于 2022-11-05 12:52:25 首次发布