django rest接口修改返回json数据格式

一/修改   MyJsonResponse 


from
django.utils import six from rest_framework.response import Response from rest_framework.serializers import Serializer class MyJsonResponse(Response): """ An HttpResponse that allows its data to be rendered into arbitrary media types. """ def __init__(self, data=None, code=None, msg=None, status=None,success=None, template_name=None, headers=None, exception=False, content_type=None): """ Alters the init arguments slightly. For example, drop 'template_name', and instead use 'data'. Setting 'renderer' and 'media_type' will typically be deferred, For example being set automatically by the `APIView`. """ super(Response, self).__init__(None, status=status) if isinstance(data, Serializer): msg = ( 'You passed a Serializer instance as data, but ' 'probably meant to pass serialized `.data` or ' '`.error`. representation.' ) raise AssertionError(msg) self.data = {"code": code, "message": msg,"success":success, "data": data} #格式是这个啊 self.template_name = template_name self.exception = exception self.content_type = content_type if headers: for name, value in six.iteritems(headers): self[name] = value from rest_framework.response import Response from rest_framework import status from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.pagination import PageNumberPagination from django.shortcuts import get_object_or_404 # from common.utils.custom_response import JsonResponse from rest_framework import filters from django_filters import rest_framework from django_filters.rest_framework import DjangoFilterBackend class CustomViewBase(viewsets.ModelViewSet): # page = GoodsPagination() # filter_class = ServerFilter queryset = '' serializer_class = '' permission_classes = () filter_fields = () search_fields = () filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,) def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return MyJsonResponse(data=serializer.data,msg="success",code=201,status=status.HTTP_201_CREATED,headers=headers,success=True) def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return MyJsonResponse(data=serializer.data,code=200,msg="success",status=status.HTTP_200_OK,success=True) def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) return MyJsonResponse(data=serializer.data,code=200,msg="success",status=status.HTTP_200_OK,success=True) def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance, '_prefetched_objects_cache', None): # If 'prefetch_related' has been applied to a queryset, we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} return MyJsonResponse(data=serializer.data,msg="success",code=200,status=status.HTTP_200_OK,success=True) def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) return MyJsonResponse(data=[],code=204,msg="delete resource success",status=status.HTTP_204_NO_CONTENT,success=True)


class ArticleViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.ListModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,viewsets.GenericViewSet):
"""
域名列表,分页,搜索,过滤,排序
"""
queryset = Article.objects.all()
serializer_class = ArticleSerializer
search_fields = ('title','content') #rest_framework 的filters
filter_fields = ('title',)



二、分页功能去做

from collections import OrderedDict
from rest_framework.response import Response
class BBsPagination(PageNumberPagination):
page_size = 20
def get_paginated_response(self, data):
res = {'message':"获取成功",'success':True,'data':OrderedDict(
[('count', self.page.paginator.count),('next', self.get_next_link()),('previous', self.get_previous_link()),('page_size', self.page_size),('data', data)])} #此次改需要的格式,而且还有分页功能
return Response(res)
 
  
class ArticleViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.ListModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,viewsets.GenericViewSet):
"""
域名列表,分页,搜索,过滤,排序
"""
queryset = Article.objects.all()
serializer_class = ArticleSerializer
search_fields = ('title','content') #rest_framework 的filters
ordering_fields = ('title',)
pagination_class = BBsPagination #分页
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_fields = ('title',)




最后修改url.py


from django.contrib import admin
from django.urls import path,include
from rest_framework import routers
from app1.views import ArticleViewSet,GoodViewSet

# 路由
routerdns = routers.DefaultRouter()
routerdns.register('article',ArticleViewSet,base_name='article')
routerdns.register('good1',GoodViewSet,base_name='good1')

# 重要的是如下三行
from rest_framework.schemas import get_schema_view
from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer
schema_view = get_schema_view(title='Users API', renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer])

urlpatterns = [
path('admin/', admin.site.urls),
path('docs/', schema_view,name="docs"),
path('api-auth/',include('rest_framework.urls',namespace='rest_framework')),
path('restapi/',include(routerdns.urls)),

]



 

社区评论  添加文章评论数的字段
class
ArticleSerializer(serializers.ModelSerializer): author_name = serializers.ReadOnlyField(source='author.username') author_avatar = serializers.ReadOnlyField(source='author.avatar') comment_num = serializers.SerializerMethodField() 文章评论数 # category = serializers.CharField(source='category.id') class Meta: model = Article fields = ('__all__') def get_comment_num(self, obj): return len(Comment.objects.filter(article = obj.id)) 这边的数据库ID要定义

 

django restframework serializer 增加自定义字段

在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段。有两种方法实现这个目的。

 

假设现在有一个Animal模型,其中有name, type, country字段,country为外键。我们在序列化Animal时,需要额外增加外键country的area信息。

方法一:

1.首先,在django的model中定义property

复制代码
class Animal(models.Model):
    name = models.CharField(max_length=50, default='')
    type = models.CharField(max_length=50, default='')
    country = models.ForeignKey(Country, blank=True, null=True)

    @property
    def country_area(self):
        return self.country.area
  
复制代码
 

2.然后在定义django restframework的serializer时,使用字段的source参数指向我们上面定义好的property

复制代码
class AnimalSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)
    type = serializers.CharField(max_length=50)
    country = serializers.PrimaryKeyRelatedField(read_only=True)
    country_area = serializers.FloatField(required=False, source='country_area’)
复制代码
 

 

方法二:

不修改django的model,直接使用SerializerMethodField(method_name=None)字段

复制代码
class AnimalSerializer(serializers.ModelSerializer):
    country_area = serializers.SerializerMethodField()

    class Meta:
        model = Animal
        fields = ('id', 'name', 'type','country','country_area')

    def get_country_area(self, obj):
        return obj.country.area 
复制代码
 

几点说明:

SerializerMethodFiel是一个read-only字段
当不指定其method_name时,默认为get_<field_name>
如果使用ModelSerializer并指定字段时,要包含此时定义的字段

 

转载于:https://www.cnblogs.com/linhankbl/p/10481516.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值