Ошибка настройки 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: Это мой первый пост, пожалуйста, дайте мне знать, если я пропустил какую-либо информацию или предоставил неполную информацию, я буду обновлять соответственно.

0 ответов

Другие вопросы по тегам