def put(self, request, index): """ 接受put请求的更新数据,更新表 :param request: :param index: 数据主键id :return: """ data = QueryDict(request.body).dict() model = self.current_model(request) logger.info(f"PUT-model: {model}-index: {index}-data: {data}") for k in data.keys(): if data[k] == '': del data[k] model.update(index, data) return jsonify({'status': 'success'})
def format_filter(self, obj): qd = QueryDict(mutable=True) filter_fields = self.filter.keys() for field_name in filter_fields: try: # check if serializer method passed in serializer_method = getattr(self.parent, self.filter[field_name]) except AttributeError: value = self.lookup_attribute(obj, self.filter[field_name]) else: value = serializer_method(obj) if not value: continue qd.update({'[{}]'.format(field_name): value}) if not qd.keys(): return None return qd.urlencode(safe=['[', ']'])
def format_filter(self, obj): qd = QueryDict(mutable=True) filter_fields = self.filter.keys() for field_name in filter_fields: try: # check if serializer method passed in serializer_method = getattr(self.parent, self.filter[field_name]) except AttributeError: value = self.lookup_attribute(obj, self.filter[field_name]) else: value = serializer_method(obj) if not value: continue qd.update({'[{}]'.format(field_name): value}) if not qd.keys(): return None return qd.urlencode(safe=['[', ']'])
def merge_query_dict(query_dict: QueryDict) -> dict: return { k: v if len(v) > 1 else v[0] for k, v in map(lambda k: (k, query_dict.getlist(k)), query_dict.keys()) if v }
def unpack_post(post: QueryDict) -> dict: """ Unpack items in POST fields that have multiple occurences. It handles: - multiple fields without brackets, ie. field - multiple fields PHP5 style, ie. field[] - objects, ie. obj[field1]=val1 obj[field2]=val2 - multiple rows of several fields, ie. row[0][field1], row[1][field1] - hierarchily nested multiples, ie. row[0][entry_id], row[0][entry_options][] Possible TODO, Django does it like this: (we could use Django parsing) <input type="hidden" name="acquisition_titles-TOTAL_FORMS" value="3" id="id_acquisition_titles-TOTAL_FORMS" autocomplete="off"> <input type="hidden" name="acquisition_titles-INITIAL_FORMS" value="0" id="id_acquisition_titles-INITIAL_FORMS"> <input type="hidden" name="acquisition_titles-MIN_NUM_FORMS" value="0" id="id_acquisition_titles-MIN_NUM_FORMS"> <input type="hidden" name="acquisition_titles-MAX_NUM_FORMS" value="1000" id="id_acquisition_titles-MAX_NUM_FORMS" autocomplete="off"> <input type="hidden" name="acquisition_titles-1-id" id="id_acquisition_titles-1-id"> <input type="hidden" name="acquisition_titles-1-property" id="id_acquisition_titles-1-property"> :param QueryDict post: POST data :return: dictionary representing the object passed in POST """ dpath_separator = '/' result = {} convert_to_array_paths = set() for k in post.keys(): # analyze field name m = re.search(r"^" + "(?P<object>[\w\-_]+)" + "(?P<selectors>(\[[\d\w\-_]+\])*)" + "(?P<trailing_brackets>\[\])?" + "$", k) if not m: raise Exception("Field name not valid: {}".format(k)) path = m.group('object') if m.group('selectors'): for ms in re.finditer(r'\[([\d\w\-_]+)\]', m.group('selectors')): # if it is integer then make sure list is created idx = ms.group(1) if re.match(r'\d+', idx): convert_to_array_paths.add(path) path += dpath_separator + idx def get_list_or_value(post, key): val = post.getlist(key) # single element leave single unless developer put brackets if len(val) == 1 and not m.group('trailing_brackets'): val = val[0] return val dpath.util.new(result, path, get_list_or_value(post, k), separator=dpath_separator) # dpath only works on dicts, but sometimes we want arrays # ie. row[0][fld]=0&row[1][fld]=1 results in row { "0": {}, "1": {} } instead of row [ {}, {} ] for path_to_d in convert_to_array_paths: arr = [] d = dpath.util.get(result, path_to_d) numeric_keys = [int(k_int) for k_int in d.keys()] for k_int in sorted(numeric_keys): arr.append(d[str(k_int)]) dpath.util.set(result, path_to_d, arr) return result