Ошибка настройки Django-простой истории ChangeReason
Я использую Django-simple-history версии 2.3.0 с Django 2.0 и Python 3.6.
Я сравниваю ранее существующие данные с новыми данными (по сравнению с serializer.validated_data), полученными с помощью запроса PUT, сравнивая поля и составляя список изменений.
Я пытаюсь добавить этот список в свой changeReason.
Моя первая попытка сохранения сериализатора и последующего вызова обновления приводит к записи 2 в базе данных.
Я попытался следовать документации и установить там, как это было предложено, но я получаю следующие ошибки:
AttributeError: 'NoneType' object has no attribute 'history_change_reason'
когда я пытаюсь передать changeReason явно, используя update_change_reason
или же
AttributeError: 'PatientSerializer' object has no attribute 'id'
когда я пытаюсь это неявно.
Мой вопрос:
Как мне обновить changeReason, а также иметь только 1 запись в базе данных.
Вот мой код для просмотра:
class PutDetailsView(APIView):
"""
View used sending response for successful patient update
"""
permission_classes = [
permissions.IsAuthenticated
]
serializer_class = PatientSerializer
def put(self, request):
is_many = True if isinstance(request.data, list) else False
try:
patient = Patient.objects.get(pk=request.data['ID'])
except Patient.DoesNotExist:
return Response({"status": 0, "error": "Patient does not exist"}, status=status.HTTP_404_NOT_FOUND)
serializer = PatientSerializer(patient, data=request.data, many=is_many)
if serializer.is_valid():
patient = Patient.objects.filter(pk=request.data['ID']).values()
my_dict = {}
for keys in patient:
for key, value in keys.items():
my_dict[key] = value
new_data_dict = dict(serializer.validated_data)
change_reason = []
print(my_dict)
print(new_data_dict)
for items in new_data_dict:
if new_data_dict[items] != my_dict[items]:
field_changed = items + " changed from " + str(my_dict[items]) + " to " + \
str(new_data_dict[items])
change_reason.append(field_changed)
else:
pass
# I get error in this line
serializer.changeReason = change_reason
serializer.save()
return Response({"status": 1, "message": "Details successfully updated"})
return Response({"status": 0, "error": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
Я попытался сначала выполнить serializer.save(), а затем вызвать объект и обновить changeReason, но это привело к двум записям в таблице простой истории для Модели. Как мне сделать это только с 1 записи.
Мой Сериализатор:
class PatientSerializer(serializers.ModelSerializer):
"""
This class is used to serialize Patient model
"""
class Meta:
model = Patient
fields = '__all__'
def create(self, validated_data):
end_session_obj = Patient.objects.create(
**validated_data
)
return end_session_obj
Благодарю.
PS: Это мой первый пост, пожалуйста, дайте мне знать, если я пропустил какую-либо информацию или предоставил неполную информацию, я буду обновлять соответственно.