Как я могу сделать метод обновления на основе условия?

Я работаю над проектом 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

Вернуться на верх