python - django 序列化问题

查看:110
本文介绍了python - django 序列化问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

class PropertyViewSet(LoginRequiredMixin, PermissionMixin, AtomicMixin, viewsets.ModelViewSet):
    serializer_class = PropertySerializer
    model = Property
    queryset = Property.objects.all()
    code_name = PERMISSION_PROPERTY

    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)
        name = request.data['name']
        city = City.objects.get(pk=request.data['city'])
        p = Pinyin()
        no = '%s%s' % (city.phone_code, p.get_initials(name, u''))
        property = Property.objects.get(pk=serializer.data['id'])
        property.no = no
        property.save_attr(request.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED,
                        headers=headers)

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        property = serializer.data
        province = Province.objects.filter(pk=property['province']).first()
        if province:
            province = ProvinceSerializer(province).data
            property['province'] = province
        city = City.objects.filter(pk=property['city']).first()
        if city:
            city = CitySerializer(city).data
            property['city'] = city
        area = Area.objects.filter(pk=property['area']).first()
        if area:
            area = AreaSerializer(area).data
            property['area'] = area
        if Decimal(property['avg_price']) == -1:
            property['avg_price'] = '待定'
        for key in property.keys():
            if type(property[key]) != int and not property[key]:
                property[key] = 'N/A'
        property['args'] = instance.tag_args()
        return Response(property, status=status.HTTP_200_OK)

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.active = False
        instance.save()
        import datetime
        instance.apartments.update(active=False,update_time=datetime.datetime.now())
        return Response({}, status=status.HTTP_200_OK)

    @list_route(methods=['get'])
    def search(self, request):
        no = self.request.GET.get('no', None)
        try:
            property = Property.objects.filter(no=no, active=True)
        except Exception:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        if not property.exists():
            return Response(status=status.HTTP_404_NOT_FOUND)
        property = property[0]
        serializer = PropertySerializer(property)
        property = serializer.data
        province = ProvinceSerializer(
            Province.objects.get(pk=property['province'])).data
        property['province'] = province
        city = CitySerializer(City.objects.get(pk=property['city'])).data
        property['city'] = city
        area = AreaSerializer(Area.objects.get(pk=property['area'])).data
        property['area'] = area
        return Response(property, status=status.HTTP_200_OK)

    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)
        city = City.objects.get(pk=request.data['city'])
        p = Pinyin()
        name = request.data['name']
        no = '%s%s' % (city.phone_code, p.get_initials(name, u''))
        property = Property.objects.get(pk=serializer.data['id'])
        property.no = no
        property.save_attr(request.data)
        return Response(serializer.data)

    @list_route(methods=['get'])
    def args(self, request):
        labels = Label.objects.prefetch_related('values').filter(active=True)
        args = []
        for label in labels:
            values = label.values.all()
            value_array = []
            for value in values:
                if not value.active:
                    continue
                if value.value:
                    value_array.append(value.value)
            if Property.tag_attr_map.get(label.name):
                args.append({'name':label.name,'data-for':Property.tag_attr_map.get(label.name),'choices':value_array,'type':label.label_type})
            else:
                args.append({'name': label.name,
                             'data-for': label.name,
                             'choices': value_array,'type':label.label_type})
        return Response(args,status=status.HTTP_200_OK)

RESTful 序列化问题搞得头大,搜关键词不能顺利搜索到想要的结果。请教诸位:

  1. perform_create 执行了什么?

  2. headers = self.get_success_headers(serializer.data) 取头部又是干嘛来着?

  3. 在方法内部使用 import datetime 好嘛?

解决方案

def perform_create(self, serializer):
    serializer.save()

def get_success_headers(self, data):
    try:
        return {'Location': data[api_settings.URL_FIELD_NAME]}
    except (TypeError, KeyError):
        return {}

建议多扒一下源码, rest-framework的源码并不多。

这篇关于python - django 序列化问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆