Как создать пользовательское поле Django с различными представлениями в админке, базе данных и Python-коде?

Я хочу создать пользовательское поле модели в Django, которое может хранить значения в байтах в базе данных, но позволяет пользователям взаимодействовать с ним в гигабайтах (ГБ) в интерфейсе администратора Django. Цель состоит в том, чтобы поле беспрепятственно обрабатывало все необходимые преобразования. В частности, поле должно принимать данные в гигабайтах при добавлении или редактировании записи в админке, преобразовывать их в байты перед сохранением в базе данных, а затем получать их в байтах для использования в коде Python.

Я начал работать над этим, переопределяя такие методы, как to_python, get_prep_value, from_db_value и formfield, но я не совсем уверен, как структурировать эти методы, чтобы поле вело себя как положено.

Вот что у меня уже есть:

class GigabyteField(models.BigIntegerField):
    def to_python(self, value):
        if value is None:
            return value
        try:
            return int(value)
        except (TypeError, ValueError):
            raise ValueError(f"Invalid value for GigabyteField: {value}")

    def get_prep_value(self, value):
        if value is None:
            return None
        return int(value * (1024**3))

    def from_db_value(self, value, *args):
        if value is None:
            return value
        return int(value / (1024**3))
Вернуться на верх