Как обрабатывать префиксные 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.

Вернуться на верх