django - 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()
解决方案
推荐阅读
- reactjs - react hooks dispatch action with use dispatch
- docker - 码头工人;错误的卷权限?
- android - PagedList.BoundaryCallback 在 DB + Network 中没有更新
- android-studio - java.lang.NumberFormatException:对于输入字符串:“[”0“]”
- file - 我想创建一个带有选项的批处理文件
- python - 我想为 pyplot 背景着色
- julia - 升级 Julia 后是否需要重新添加软件包
- flutter - 如何在 Flutter WebView 中的进度指示器之后进行下一个活动?
- python - 熊猫提取嵌套数据
- mysql - MySQL 新手,在加入 3 个按月汇总的表时遇到问题