Как создать пользовательское поле 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))