PATCH上不会调用验证

时间:2016-11-03 09:07:02

标签: django django-rest-framework

我有一个像

这样的序列化器
class MySerializer(serializers.HyperlinkedModelSerializer):
    age = serializers.HiddenField(default=None)

    class Meta:
        model = Profile

    def validate_age(self, value):
        # this code not executing in update(put/patch) 

并查看

class MyView(viewsets.GenericViewSet, mixins.UpdateModelMixin, mixins.CreateModelMixin):

    queryset = Profile.objects.all()
    serializer_class = MySerializer
    permission_classes = (IsAuthenticated,) 

当我POST调用数据validate_age时,而PATCH则不会。这是预期的行为还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

只是发布一些细节以防任何人遇到类似问题。挖掘得更深一些,我发现我的HiddenField被跳过here,因为我觉得空值。 getattr(self.root, 'partial')返回True,这是因为PATCH

APIView在partial_updateUpdateModelMixin致电PATCHpartialupdate设为True。虽然在PUT PATCH(非partial_update)方法的情况下被调用。所以我只是将HTTP方法从PUT更改为HiddenField,一切正常。

然而现在的问题是为什么在部分更新时会忽略CREATE OR REPLACE PROCEDURE TABLERISIKO IS BEGIN execute immediate 'drop table risiko'; execute immediate 'CREATE TABLE Risiko ( RNr INTEGER, Projekt INTEGER, Text VARCHAR(25), Gruppe INTEGER, Auswirkung INTEGER, WKeit INTEGER, Pruefdatum DATE, PRIMARY KEY (RNr), CONSTRAINT FKRisiko1 FOREIGN KEY (Projekt) REFERENCES Projekt(ProNr), CONSTRAINT FKRisiko2 FOREIGN KEY (Gruppe) REFERENCES Risikogruppe (RGNr), CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0), CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100) )'; commit; execute immediate ' INSERT INTO Risiko VALUES(1,1,||'''||'Anforderungenunklar'||'''||,1,50000,30 ,TO_DATE(||'''||'25.01.06'||'''||,||'''||'DD.MM.YY'||'''||)); INSERT INTO Risiko VALUES(2,1,||'''||'Abnahmeprozess offen'||'''||,2,30000,70 ,TO_DATE(||'''||'26.02.06'||'''||,||'''||'DD.MM.YY'||'''||)); INSERT INTO Risiko VALUES(3,2,||'''||'Ansprechpartner wechseln'||'''||,1,20000,80 ,TO_DATE(||'''||'06.05.06'||'''||,||'''||'DD.MM.YY'||'''||)); INSERT INTO Risiko VALUES(4,2,||'''||'neue Entwicklungsumgebung'||'''||,3,40000,20 ,TO_DATE(||'''||'05.10.06'||'''||,||'''||'DD.MM.YY'||'''||))'; commit; END; 。 :)

答案 1 :(得分:-2)

根据django-rest docs:

  

[HiddenFiled]字段类,它不根据用户输入获取值,而是从默认值或可调用的值中获取值。

http://www.django-rest-framework.org/api-guide/fields/#hiddenfield

因此,任何年龄的用户输入都不会实际运行您的特定验证码。

另一个片段:

  

此字段类型不接受用户输入,而是始终返回   它是序列化程序中validated_data的默认值。

http://www.django-rest-framework.org/api-guide/validators/

我建议使用某种IntegerField甚至CharField,具体取决于您的业务逻辑。