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)