Как я могу сделать метод обновления на основе условия?
Я работаю над проектом Django и хочу перейти к методу update на основе условия - если значение requeststatusid = 0. Я пытался добавить обработку ошибок в мои сериализаторы, но независимо от значения, он выбрасывает ошибку. Буду признателен за любую помощь!
Вот мой сериализатор с методом create и update. Посмотрите мое условие if/else в методе update.
class RequestCreateSerializer(serializers.ModelSerializer):
parts=PartSerializer(many=True)
class Meta:
model = requestTable
fields = ['rid','requestid', 'requeststatusid', 'requesterid', 'requestname', 'parts']
parts = serializers.SerializerMethodField()
def create(self, validated_data):
parts_data = validated_data.pop('parts')
request = requestTable.objects.create(**validated_data)
for part_data in parts_data:
partsTable.objects.create(request=request, **part_data)
return request
def update(self, instance, validated_data):
if instance.requeststatusid == '0':
parts_data = validated_data.pop('parts')
part = (instance.parts).all()
part = list(part)
instance.requeststatusid = validated_data.get('requeststatusid', instance.requeststatusid)
instance.requestname = validated_data.get('requestname', instance.requestname)
instance.save()
for part_data in parts_data:
partreq = part.pop()
partreq.validatorid = part_data.get('validatorid', partreq.validatorid)
partreq.partsstatusid = part_data.get('partsstatusid', partreq.partsstatusid)
partreq.englishmaterialdescription = part_data.get('englishmaterialdescription', partreq.englishmaterialdescription)
partreq.save()
return instance
else:
raise ValidationError({"Error": 'Non-drafts are non-editable.'})
//views.py
class RequestListCreateView(ListCreateAPIView):
queryset = requestTable.objects.all()
serializer_class = RequestCreateSerializer
filterset_class = RequestFilter
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields=['rid', 'requeststatusid']
search_fields= ['requestname', 'requestid', 'businessunitid__businessunitname', 'plantid__plantname', 'parts__partsid']
def create(self, request, *args, **kwargs):
write_serializer = RequestCreateSerializer(data=request.data)
write_serializer.is_valid(raise_exception=True)
instance = self.perform_create(write_serializer)
headers = self.get_success_headers(write_serializer.data)
return Response({"Request ID": write_serializer.instance.requestid, "Parts ID": [p.partsid for p in write_serializer.instance.parts.all()]},headers=headers)
def get_queryset(self):
return requestTable.objects.exclude(requeststatusid='0').exclude(requeststatusid='4')
Вот примерные данные:
{
"rid": 4,
"requestid": "ABC0000004",
"requeststatusid": 0,
"requestname": "Draft",
"projectmanager": "Manager"
"parts": [
{
"pid": 7,
"partsid": "ABC0000007",
"validatorid": "bcdd5f90-8e4a-4306-b2fe-1ea3218ee430",
"partsstatusid": 0,
"englishmaterialdescription": "Prefilter element FRP-95-115",
}
]
}
Я заметил, что вы сравниваете '0' с 0 (str с int), для этого переходим к else statment raise ValidationError({"Error": 'Non-drafts are non-editable.'})
сделайте if instance.requeststatusid == 0:
, потому что в вашем запросе это 0, как int