Как правильно сериализовать список списков - PullRequest
0 голосов
/ 23 апреля 2019

Я пишу django API, в котором мне нужно вернуть список списков.Я попытался сделать это в качестве модельного сериализатора, но я получил следующую ошибку, когда начал создавать ответ со списком списков:

AttributeError: Got AttributeError when attempting to get a value for field `contract_number` on serializer `ContractsSignUpListSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `list` instance.

Я начал создавать ответ из-за того, что мне нужно было тянутьв атрибутах из 3 разных таблиц, и каждый раз, когда я использовал их соответствующий сериализатор модели, он выдавал мне ошибки атрибутов для одной из других моделей.

Это атрибуты, которые мне нужны были получены из 3 разных таблиц:

query = SignUpTable.objects.filter(empid_id__empid=int(input))

            for q in query:
                print q.empid.first_name,
                print q.empid.last_name,
                print q.signedup,
                print q.contract_number.contract_number,

Я попытался вернуть переменную Query, которая работает, но она предоставляет мне только внешний ключ в текущей таблице, когда мне нужен один или два атрибута из другой таблицы и необязательно внешний ключ в текущей таблице.Таблица.

Я также пытался вернуть список списков с помощью сериализатора списка, но получил сообщение об ошибке, что дочерний элемент не был предоставлен.

class ContractEmployeeResponseSerializer(serializers.ListSerializer):
    data = serializers.ListField(
        child = serializers.ListField(
            child = serializers.CharField(max_length=255)
        )
    )

У меня есть 3 таблицы Сотрудники, Контракты,и SignUpTable, где таблица регистрации имеет первичный ключ empid и contract_number из двух других таблицnd используется в качестве слабой сущности для транзакций.

Я просматривал многие сообщения сериализации stackoverflow, но мне кажется, что есть кое-что фундаментальное, что я все еще упускаю.

этот сериализатор будетотобразить информацию о моем внешнем ключе, но не предоставит мне доступ к объектам «Сотрудники» или «Контракты», от которых мне нужно получить поля.

class ContractsSignUpListSerializer(serializers.ModelSerializer):
    class Meta:
        model = SignUpTable
        fields = '__all__'

Вот представление, которое я возвращаю:

class SignUpTableCreate(generics.ListCreateAPIView):
    # serializer_class = ContractEmployeeResponseSerializer
    serializer_class = ContractsSignUpListSerializer

    def get_queryset(self):
        input = self.request.parser_context['kwargs']['input']
        table = self.request.parser_context['kwargs']['table']
        print("input: ", input)
        print("table: ", table)

        if table == "Contracts":
            query = SignUpTable.objects.filter(contract_number_id__contract_number=str(input))
            for q in query:
                print q.empid.first_name,
                print q.empid.last_name,
                print q.signedup,
                print q.contract_number.contract_number,
                print "\n"
            ret = [[q.empid.first_name + ' ' + q.empid.last_name, q.contract_number.contract_number, str(q.signedup)] for q in query]

            return ret
            # return query

        elif table == "Employees":
            query = SignUpTable.objects.filter(empid_id__empid=int(input))

            for q in query:
                print q.empid.first_name,
                print q.empid.last_name,
                print q.signedup,
                print q.contract_number.contract_number,
                print "\n"
            ret = [[q.empid.first_name + ' ' + q.empid.last_name, q.contract_number.contract_number, str(q.signedup)] for q in query]

            return ret
            # return query

Очевидно, что при использовании сериализатора модели произойдет ошибка при возврате вложенного списка списков, но даже при использовании вышеупомянутого сериализатора списка я получил сообщение об ошибке, отображаемое ниже во всей полноте:

Internal Server Error: /ContractSignUp/api/SignUpTableCreate/Contracts/NX19-004
Traceback (most recent call last):
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\generics.py", line 241, in get
    return self.list(request, *args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\mixins.py", line 47, in list
    serializer = self.get_serializer(queryset, many=True)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\generics.py", line 112, in get_serializer
    return serializer_class(*args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\serializers.py", line 124, in __new__
    return cls.many_init(*args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\serializers.py", line 145, in many_init
    child_serializer = cls(*args, **kwargs)
  File "C:\Users\dgutsch\Desktop\related-work-application\ENV\lib\site-packages\rest_framework\serializers.py", line 592, in __init__
    assert self.child is not None, '`child` is a required argument.'
AssertionError: `child` is a required argument.
...