我将 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:这是我的第一篇文章,如果我遗漏了任何信息或提供的信息不完整,请告诉我,我会相应地更新。