Написать более тонкий вид в django ModelViewSet - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть пример проекта по ссылке github link . Проблема в том, что logi c в основном обрабатывает данные, а не сериализаторы. Я прочитал это как плохую практику:

class OrgAddAPI(viewsets.ModelViewSet):
    queryset = Organization.objects.root_nodes()
    serializer_class = OrganizationSerializer

    def create(self, request):
        alldata = request.POST
        # desc = alldata.get("desc", "0")
        # name = alldata.get("name", "0")
        desc = request.data.get("desc")
        name = request.data.get("name")
        code = request.data.get("code")
        subpath = request.data.get("subpath")
        try:
            parent = Organization.objects.root_nodes().get()
        except Exception as e:
            print(e.__class__.__name__)
            if e.__class__.__name__ == "DoesNotExist":
                parent = Organization.objects.create(name="BOSS", desc="boss",code="BOSS",subpath="ftech")
            else:
                response_dict = {"c" : ErrorCode.ORG_GENERIC_ERROR,  "m": str(e),
                                 "e" : ErrorCode(ErrorCode.ORG_GENERIC_ERROR.name)}
                return Response(response_dict)

        try:
            Organization.objects.create(name=name, desc=desc, code = code, subpath =subpath, parent=parent)
        except Exception as e:
            response_dict = {"c" : ErrorCode.ORG_GENERIC_ERROR, "m": str(e),
                             "e" : ErrorCode.ORG_GENERIC_ERROR.name}
            return Response(response_dict)

        response_dict = {"result": "true"}
        # update response_dict with whatever you want to send in response
        return Response(response_dict)

Я пытался выполнить рефакторинг на сериализатор, но он не перешел на новую функцию:

class OrganizationSerializer(serializers.ModelSerializer):
    children = RecursiveField(many=True)
    def validate(self,data):
        """ //// not jump
        check that root node must be available
        :param data:
        :return:
        """
        serialized = jsonpickle.encode(data)
        print(yaml.dump(yaml.load(serialized), indent=2))

    def create(self, validated_data):
        name = validated_data.get("name", None) // not jump
        serialized = jsonpickle.encode(validated_data)
        print(yaml.dump(yaml.load(serialized), indent=2))
    class Meta:
        model = Organization
        fields = ('id', 'name', 'code' , 'subpath' , 'desc', 'parent_id', 'level', 'children')

Что я сделал не так? Извините, если это звучит нуб вопрос.

1 Ответ

1 голос
/ 24 февраля 2020

Проблема в том, что логи c обрабатывают в основном на виду ...

Я бы сказал все . Проблема в том, что вы не используете сериализатор в вашем представлении. Вы можете увидеть здесь реализацию по умолчанию метода create. Он использует get_serializer, который в конце использует serializer_class атрибут класса. Следуйте этому подходу, и он будет прыгать, куда вы хотите.

...