缓解数据库查询压力(重写ListModelMixin的list方法)
def list(self, request, *args, **kwargs):
query_params = {"tar_time__lte": datetime.datetime.now()}
if "tar_start_time" not in request.query_params:
query_params['tar_time__gte'] = datetime.datetime.now().date() - datetime.timedelta(16)
# 获取查询集
queryset = self.filter_queryset(self.get_queryset().filter(**query_params))
# 分页
page = self.paginate_queryset(queryset.values('id'))
# To select id instead of *
ids = [i['id'] for i in page]
# 以id查询
page = RobotsLog.objects.filter(id__in=ids).order_by('-tar_time')
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 Response(serializer.data)
class TestSerializer(serializers.ModelSerializer):
file_path = serializers.SerializerMethodField() # file_path默认来自get_file_path函数,当然serializers.SerializerMethodField()也可以指定函数
@staticmethod
def get_file_path(obj):
"""对模型类字段进行修改"""
pass
方法2:重写序列化器的to_representation方法
def to_representation(self, instance):
"""
Object instance -> Dict of primitive datatypes.
"""
ret = OrderedDict()
fields = self._readable_fields
for field in fields:
try:
attribute = field.get_attribute(instance)
except SkipField:
continue
check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
if check_for_none is None:
ret[field.field_name] = None
else:
ret[field.field_name] = field.to_representation(attribute)
if field.field_name == "picture_path2": # 指定字段名
if field.to_representation(attribute).startswith("http"):
# 修改返回的字段值
ret[field.field_name] = field.to_representation(attribute)
else:
oss = Oss(**settings.ALI_OSS_CONF["narwal_images"])
key = get_key(attribute, field)
ret[field.field_name] = oss.get_sign_url(key)
if field.field_name == "picture_path":
if field.to_representation(attribute).startswith("http"):
ret[field.field_name] = field.to_representation(attribute)
else:
oss = Oss(**settings.ALI_OSS_CONF["narwal_images"])
key = get_key(attribute, field)
ret[field.field_name] = oss.get_sign_url(key)
if field.field_name == "video_path":
if field.to_representation(attribute).startswith("http"):
ret[field.field_name] = field.to_representation(attribute)
else:
oss = Oss(**settings.ALI_OSS_CONF["narwal_logs"])
key = get_key(attribute, field)
ret[field.field_name] = oss.get_sign_url(key)
return ret
方法3:重写ListModelMixin的list方法