Я пишу 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.