• AutoField的话就报错:'AutoField' object has no attribute 'rel'


    def data_inspect(self, data, extra=None):
            if isinstance(data, (QuerySet, Page, list)):
                convert_data = []
                if extra:
                    for i, obj in enumerate(data):
                        convert_data.append(self.data_inspect(obj, extra.get(
                            **{self.through_fields[0]: obj, self.through_fields[1]: self.source_field})))
                else:
                    for obj in data:
                        convert_data.append(self.data_inspect(obj))
                return convert_data
            elif isinstance(data, models.Model):
                obj_dict = {}
                concrete_model = data._meta.concrete_model
                for field in concrete_model._meta.local_fields:
                    # 检查 field 是否存在 rel 这个属性,为'AutoField' object has no attribute 'rel'错误填坑
                    if hasattr(field, 'rel'):
                        if field.rel is None:
                            if self.check_attr(field.name) and hasattr(data, field.name):
                                obj_dict[field.name] = self.data_inspect(getattr(data, field.name))
                        else:
                            if self.check_attr(field.name) and self.foreign:
                                obj_dict[field.name] = self.data_inspect(getattr(data, field.name))
                    else:
                        if self.check_attr(field.name) and hasattr(data, field.name):
                            obj_dict[field.name] = self.data_inspect(getattr(data, field.name))
                for field in concrete_model._meta.many_to_many:
                    if self.check_attr(field.name) and self.many:
                        obj_dict[field.name] = self.data_inspect(getattr(data, field.name))
                for k, v in data.__dict__.items():
                    if not str(k).startswith('_') and k not in obj_dict.keys() and self.check_attr(k):
                        obj_dict[k] = self.data_inspect(v)
                if extra:
                    for field in extra._meta.concrete_model._meta.local_fields:
                        if field.name not in obj_dict.keys() and field.name not in self.through_fields:
                            if field.rel is None:
                                if self.check_attr(field.name) and hasattr(extra, field.name):
                                    obj_dict[field.name] = self.data_inspect(getattr(extra, field.name))
                            else:
                                if self.check_attr(field.name) and self.foreign:
                                    obj_dict[field.name] = self.data_inspect(getattr(extra, field.name))
                return obj_dict
            elif isinstance(data, manager.Manager):
                through_list = data.through._meta.concrete_model._meta.local_fields
                through_data = data.through._default_manager
                self.through_fields = [data.target_field.name, data.source_field.name]
                self.source_field = data.instance
                if len(through_list) > 3 and self.through:
                    return self.data_inspect(data.all(), through_data)
                else:
                    return self.data_inspect(data.all())
            elif isinstance(data, (datetime.datetime, datetime.date, datetime.time)):
                return self.time_func(data)
            elif isinstance(data, (ImageFieldFile, FileField)):
                return data.url if data.url else data.path
            elif isinstance(data, Decimal):
                return float(data)
            elif isinstance(data, dict):
                obj_dict = {}
                if self._dict_check:
                    for k, v in data.items():
                        obj_dict[k] = self.data_inspect(v)
                else:
                    for k, v in data.items():
                        if self.check_attr(k):
                            obj_dict[k] = self.data_inspect(v)
                return obj_dict
            elif isinstance(data, (str, bool, float, int)):
                return data
            else:
                return None
  • 相关阅读:
    浏览器页面呈现过程
    Function与Object
    前端性能优化方案
    CSS引入方式
    浏览器事件
    Js继承的实现方式
    H5页面 绝对定位元素被 软键盘弹出时顶起
    总结angular+ionic项目中的问题
    vue开发学习中遇到的问题以及解决方法
    css重修之书(一):如何用css制作比1px更细的边框
  • 原文地址:https://www.cnblogs.com/ameile/p/10078809.html
Copyright © 2020-2023  润新知