首页 > 解决方案 > Django Rest Framework 模型序列化器字段级别验证

问题描述

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

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

模型部分:

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

所以想法是将所有代码翻译成各自的翻译,并将其保存为键值对。这是因为我总是需要将代码及其翻译放在一起,从性能的角度来看,这样做一次并将其保存在数据库中比在读取时进行翻译更有意义。

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()

标签: djangodjango-rest-frameworkdjango-serializer

解决方案


推荐阅读