Проверка уровня поля сериализатора модели Django Rest Framework

У меня есть 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()

person Alex    schedule 02.05.2019    source источник
comment
Можете ли вы тоже поделиться своим мнением?   -  person opalczynski    schedule 03.05.2019
comment
@opalczynski Ага   -  person Alex    schedule 04.05.2019
comment
@Alex stackoverflow.com/a/27591842/8555313 проверьте это   -  person Vikramark    schedule 10.08.2020