У меня есть DRF ModelSerializer, и я пытаюсь переопределить проверку, но безрезультатно.
Причина переопределения проверки заключается в том, что соответствующее поле модели является HStoreField postgresql, поэтому фактически это python dict. Однако входящие данные представляют собой массив, и я строю соответствующий 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
Итак, идея состоит в том, чтобы перевести все коды в соответствующие переводы и сохранить это как пару ключ-значение. Это потому, что мне всегда будет нужен код и его перевод вместе, и с точки зрения производительности имеет смысл сделать это один раз и сохранить его в базе данных, а не выполнять перевод при чтении.
Вкратце: поле модели ожидает 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()