django остальные рамки добавить поле только для записи для преобразования единиц - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь написать API, позволяющий пользователям читать длину в километрах, но записывать ее в милях. Модель хранит информацию в километрах.

Идея заключается в достижении чего-то подобного:

class AreaSizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = AreaSize
        fields = ['width', 'height']

    # This function should perform the unit conversion
    def write_width(self, miles):
        self.width = miles * 1.609344

    ...

Поэтому, когда пользователь выполняет запрос POST, содержащий размер в милях, он преобразуется в километры. и хранится в базе данных.

Может кто-нибудь объяснить, как это сделать?

1 Ответ

0 голосов
/ 06 января 2020

Переопределите save и update методы в вашем классе AreaSizeSerializer для выполнения преобразования единиц измерения в поле ширины всякий раз, когда оно сохраняется или обновляется.


class AreaSizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = AreaSize
        fields = ['width', 'height']

    def width_mi_to_km(self, width):
        return 1.609344 * width

    def save(self, validated_data):
        area_size = {
            **validated_data, 
            'width': self.width_mi_to_km(validated_data['width'])
        }
        return super().save(area_size)

    def update(self, instance, validated_data):
        area_size = {
            **validated_data, 
            'width': self.width_mi_to_km(validated_data['width'])
        }
        return super().update(instance, area_size)
...