Django Rest Framework模型序列化程序字段级别验证

时间:2019-05-02 00:14:18

标签: django django-rest-framework django-serializer

我有一个DRF ModelSerializer,但我试图覆盖验证,但无济于事。

覆盖验证的原因是相应的模型字段是postgresql HStoreField,因此实际上是python dict。但是,传入的数据是一个数组,我在create函数期间构建了相应的字典。

模型零件:

class Report(models.Model):
    report = HStoreField()

序列化器:

class ReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = Report
        fields = "__all__"

    def create(self, validated_data):
        codes = validated_data.pop("report")
        report = {code: translate_code(code) for code in codes}
        return Report(**validated_data, report=report)

    def validate_report(self, value):
        print("called")
        return type(value) == type([]) # I know this is hacky

因此,想法是将所有代码转换为各自的转换,并将其保存为键值对。这是因为我将始终需要代码及其转换,并且从性能的角度来看,一次执行并将其保存在db中比在读取时进行转换更为有意义。

tl; dr:“模型”字段期望使用dict,数据实际上是列表,我正在尝试覆盖序列化程序上此字段的验证以接受此要求。

不幸的是,似乎从未调用validate_report函数,而且我不确定为什么。

编辑

我也尝试过:

class ReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = Report
        fields = "__all__"
        validators = []

    def create(self, validated_data):
        codes = validated_data.pop("report")
        report = {code: translate_code(code) for code in codes}
        return Report(**validated_data, report=report)

    def validate(self, data):
        return isinstance(data["report"], "list")

但是这个validate()也没有被调用

编辑:视图集:

class ReportsViewset(viewsets.ModelViewSet):
    serializer_class = ReportSerializer
    viewset = Report.objects.all()

0 个答案:

没有答案