Сериализатор Django для преобразования списка ключей словаря в поля модели

Я использую pandas openpyxl для чтения файла excel в моем проекте. После чтения excel-файла я получаю список словарей. Эти словари имеют такие ключи, как "Год 2024", "Диапазон", "Основная точка" и т. д.

У меня есть поле в моем приложении Django, которое содержит такие поля, как "year", "range", "main_point".

Мой вопрос заключается в том, как я могу написать сериализатор для преобразования ключей словаря в поля в моей модели? Я хочу сделать это в сериализаторе, потому что я также хочу проверять данные словаря.

Итак, у меня есть такой список:

my_data = [
{"Year 2024": "5", "Range":"2", "Main Point": "OK"},
{"Year 2024": "6", "Range":"3", "Main Point": "OK"},
{"Year 2024": "7", "Range":"4", "Main Point": "OK"},
...
]

и моя модель

class MyModel(models.Model):
    year = models.IntegerField(...)
    range = models.IntegerField(...)
    main_pont = models.CharField(...)

Спасибо

Попытка:

from rest_framework import serializers
from .models import MyModel

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ['year', 'range', 'main_point']

    def to_internal_value(self, data):
        mapped_data = {
            'year': data.get('Year 2024'),
            'range': data.get('Range'),
            'main_point': data.get('Main Point')
        }
        return super().to_internal_value(mapped_data)

    def validate_year(self, value):
        try:
            return int(value)
        except ValueError:
            raise serializers.ValidationError("Year must be a valid integer.")

    def validate_range(self, value):
        try:
            return int(value)
        except ValueError:
            raise serializers.ValidationError("Range must be a valid integer.")

    def validate_main_point(self, value):
        if not isinstance(value, str):
            raise serializers.ValidationError("Main point must be a valid string.")
        return value

Так, в качестве примера использования:

my_data = [
    {"Year 2024": "2023", "Range": "2", "Main Point": "OK"},
    {"Year 2024": "2025", "Range": "3", "Main Point": "OK"},
    {"Year 2024": "2022", "Range": "4", "Main Point": "OK"}
]

serializer = MyModelSerializer(data=my_data, many=True)

if serializer.is_valid():
    serializer.save()
else:
    print(serializer.errors)
Вернуться на верх