如何在Django-Tastypie中创建员工汇总端点并保留核心功能
解决Tastypie创建Summary端点返回指定字段的问题
这问题我之前也碰到过,其实不用硬改get_list()的底层逻辑——咱们可以先复用主端点已经实现的过滤、排序、分页功能,再对返回的字段做筛选就行。给你两种实用方案:
方案1:直接过滤响应字段(简单快捷)
这种方法最省心,先调用主端点的get_list()拿到完整处理后的响应,再只保留你需要的5个字段:
class EmployeeResource(ModelResource): # 注意你之前拼写错了,应该是EmployeeResource class Meta: queryset = Employees.objects.all() resource_name = 'employees' allowed_methods = ['get','post','put','patch'] def prepend_urls(self): return [ url(r"^(?P<resource_name>%s)/summary%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('summary'), name="summary"), ] def summary(self, request, **kwargs): # 先通过主资源的get_list获取经过过滤、排序、分页的完整响应 self.method_check(request, allowed=['get']) self.is_authenticated(request) self.throttle_check(request) # 调用主端点的list逻辑,拿到处理好的响应 response = self.get_list(request, **kwargs) # 定义你需要保留的5个字段,替换成实际字段名 desired_fields = {'id', 'name', 'department', 'hire_date', 'salary'} # 遍历每个对象,删除不需要的字段 for obj in response.data['objects']: # 找出所有不在目标字段里的键并删除 unwanted_keys = [key for key in obj if key not in desired_fields] for key in unwanted_keys: del obj[key] self.log_throttled_access(request) return response
方案2:临时资源类(更优雅的方式)
如果之后这个summary端点需要单独扩展逻辑,或者字段较多,建议用临时子类来限定字段,这样更符合Tastypie的设计:
class EmployeeResource(ModelResource): class Meta: queryset = Employees.objects.all() resource_name = 'employees' allowed_methods = ['get','post','put','patch'] def prepend_urls(self): return [ url(r"^(?P<resource_name>%s)/summary%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('summary'), name="summary"), ] def summary(self, request, **kwargs): self.method_check(request, allowed=['get']) self.is_authenticated(request) self.throttle_check(request) # 获取经过主资源过滤、排序后的queryset queryset = self.get_object_list(request) queryset = self.apply_sorting(queryset, request) # 复用主资源的分页配置 paginator = self._meta.paginator_class( request.GET, queryset, resource_uri=self.get_resource_uri(), limit=self._meta.limit, offset=self._meta.offset ) page = paginator.page() # 创建临时资源子类,仅指定需要的字段 class SummaryEmployeeResource(EmployeeResource): class Meta(EmployeeResource.Meta): fields = ['id', 'name', 'department', 'hire_date', 'salary'] # 替换为你的目标字段 # 用临时资源序列化数据 summary_resource = SummaryEmployeeResource() bundles = [summary_resource.build_bundle(obj=obj, request=request) for obj in page['objects']] serialized_objects = [summary_resource.full_dehydrate(bundle) for bundle in bundles] # 构建包含分页信息的响应 response_data = { 'meta': page['meta'], 'objects': serialized_objects } self.log_throttled_access(request) return self.create_response(request, response_data)
关键说明
- 两种方案都保留了主端点
/employees/的所有核心功能:过滤、排序、分页逻辑完全复用,不用重复开发。 - 注意替换代码里的
desired_fields或fields为你实际需要的5个字段名,要和模型字段或资源里定义的字段一致。 - 方案1更适合快速实现,方案2的扩展性更好,后续如果要给summary端点加单独的权限、脱水逻辑都很方便。
内容的提问来源于stack exchange,提问作者Dhanushka Amarakoon
相关产品推荐
相关产品推荐

