我有一个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()