Django-rest-framework实用骚操作共享

1. 修改request上传的数据

request.data._mutable = True  # 默认是False,修改为True后便能操作
request.data['description'] = 'soadhasogdoasdoasdg'  # 字典添加
request.data._mutable = False  # 记得将其关闭

2. 获取URL中的正则匹配组

URL中的正则表达式匹配的数据,都保存在kwargs里

# url.py
urlpatterns = [re_path('starimg/(?P<pk>\d+)' , views.StarImgViews.as_view()) ,]

# views.py
class StarImgViews(ListAPIView):
	queryset = Star.objects.all()
    serializer_class = StarImgSerializer
    def list(self, request, *args, **kwargs):
    	print(kwargs)

3. 序列化应用

普通形态:

class StarsViews(ListAPIView):
    queryset = Star.objects.all()
    serializer_class = StarImgSerializer

变换形态:

class StarImgViews(ListAPIView):

    def list(self, request, *args, **kwargs):
        queryset = Star.objects.all()
        serializer = StarImgSerializer(queryset, many=True)  # 使用这种,会得到不加任何装饰,最原始的数据。如果不想要框架主动给你添加的装饰,就可以考虑使用
        return Response(serializer.data)

差异在于:可以自行修改list展现出想要展现的数据,配合第2点的提取正则匹配组使用会很舒服。

4.同时获取多个序列化对象
安装

pip install django-rest-multiple-models

settings配置中配置一下APP

INSTALLED_APPS = (
    ....
    'drf_multiple_model',
)

使用(queryset只能是数据集合,不能是单个)

class TextAPIView(ObjectMultipleModelAPIView):
    querylist = [
        {'queryset': Play.objects.all(), 'serializer_class': PlaySerializer},
        {'queryset': Poem.objects.filter(style='Sonnet'), 'serializer_class': PoemSerializer},
        ....

6.ImageField字段的坑
由于django的ImageField路劲自带会附加上URL,而上传图片后返回的是错误URL,要在create函数里返回正确URL

# 1.搜索找到FileField,直接修改to_representation方法
'''亲测类覆盖,重写方法都无效,只有直接修改原文件的方法才能生效,之所以会自动加上URL是因为该方法执行了这个函数'''
if request is not None:
   	return request.build_absolute_uri(url)
   	# url就是数据库中的路劲,对这里的路劲直接进行修改即可

7.create方法里面使用list方法的序列化
根据源代码的list方法,简写版本如下

class ListModelMixin:
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())  # 获取queryset
        serializer = self.get_serializer(queryset,  many=True)  # 序列化queryset
        return Response(serializer.data)  # 返回数据

基于ListCreateAPIView里面都有get_serializer方法,而里面也没有定义这个方法,证明’get’和’post’是共用的同一个方法,由此可得出我们可以在create方法里利用list的方法去序列化数据

class UsersViews(CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def post(self, request, *args, **kwargs):
        if request.query_params.get('action') == 'login':
            username = request.data.get('username')
            password = request.data.get('password')
            print(username)
            try:
                user = User.objects.get(username=username)
                print(user)
                if user.password == password:
                    # 验证通过,返回用户实例与token
                    uid = uuid.uuid4().hex
					
					# 主要是这一步利用list里的源代码去序列化数据
                    queryset = User.objects.filter(username=username)
                    serializer = self.get_serializer(queryset , many=True)
                    return Response(data=serializer.data)

8.修改get方法获取到的数据
基于ObjectMultipleModelAPIView来实现
直接其list方法

# 利用ObjectMultipleModelAPIView的list方法来序列化数据
querylist = [{'queryset': User.objects.filter(username=username), 'serializer_class': UserSerializer}]

results = self.get_empty_results()

for query_data in querylist:
	self.check_query_data(query_data)

	queryset = self.load_queryset(query_data , request , *args , **kwargs)

   # Run the paired serializer
   context = self.get_serializer_context()
   data = query_data['serializer_class'](queryset , many=True , context=context).data

   label = self.get_label(queryset , query_data)

   # Add the serializer data to the running results tally
   results = self.add_to_results(data , label , results)

formatted_results = self.format_results(results , request)
formatted_results.update({'token': uid})  # 获取到结果后使用update来添加你想要添加的数据即可
return Response(formatted_results)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值