0

我将 Django-simple-history 版本 2.3.0 与 Django 2.0 和 Python 3.6 一起使用。

我正在将先前存在的数据与通过 PUT 请求接收的新数据(与 serializer.validated_data 相比)进行比较,比较字段并制作更改列表。

我正在尝试将此列表添加到我的 changeReason 中。

我第一次尝试保存序列化程序然后调用更新导致数据库中有 2 个条目。

我尝试遵循文档并按照那里的建议进行设置,但出现以下错误:

AttributeError: 'NoneType' object has no attribute 'history_change_reason'

当我尝试使用 update_change_reason 显式传递 changeReason

或者

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,但这会导致模型的简单历史记录表中有 2 个条目。我如何只用 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:这是我的第一篇文章,如果我遗漏了任何信息或提供的信息不完整,请告诉我,我会相应地更新。

4

0 回答 0