Как обрабатывать префиксные UUID в Django Admin для запросов и отображения объектов?
Я работаю над проектом Django с пользовательским UUIDField с префиксом (например, ft_
) для представления идентификаторов. Необработанный UUID хранится в базе данных, но я хочу, чтобы значение с префиксом (например, ft_) отображалось в ответах API, интерфейсе администратора и других местах. Однако это создает проблемы при запросе объектов в Django Admin, поскольку URL содержат префиксный ID, и Django пытается запросить базу данных напрямую, используя это префиксное значение.
Вот моя реализация пользовательского поля:
import uuid
from django.db import models
class PrefixedUUIDField(models.UUIDField):
def __init__(self, prefix, *args, **kwargs):
self.prefix = prefix
super().__init__(*args, **kwargs)
def from_db_value(self, value, expression, connection):
if value is None:
return value
return f"{self.prefix}_{value}"
def get_prep_value(self, value):
if isinstance(value, str) and value.startswith(f"{self.prefix}_"):
value = value.split(f"{self.prefix}_")[1]
return super().get_prep_value(value)
def to_python(self, value):
if isinstance(value, uuid.UUID):
return f"{self.prefix}_{value.hex}"
if isinstance(value, str) and not value.startswith(f"{self.prefix}_"):
return f"{self.prefix}_{value}"
return value
Модель:
class FamilyTree(models.Model):
id = PrefixedUUIDField(prefix="ft", primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=255)
В Django Admin URL для редактирования объекта выглядит следующим образом:
http://admin.localhost:8000/family_tree/familytree/ft_5F5479ca65374d401d9466d57fc95e4072/change/
Однако это приводит к следующей ошибке:
invalid input syntax for type uuid: "ft_5F5479ca65374d401d9466d57fc95e4072"
Как я понимаю, это происходит потому, что Django Admin пытается запросить базу данных, используя префиксный id, но база данных ожидает необработанный UUID.