Как обрабатывать UUID с префиксом в администраторе Django для запроса и отображения объектов?Python

Программы на Python
Ответить
Anonymous
 Как обрабатывать UUID с префиксом в администраторе Django для запроса и отображения объектов?

Сообщение Anonymous »

Я работаю над проектом Django с пользовательским UUIDField с префиксом (например, ft_) для представления идентификаторов. Необработанный UUID хранится в базе данных, но я хочу, чтобы значение префикса (например, ft_) отображалось в ответах API, интерфейсах администратора и в других местах. Однако это создает проблемы при запросе объектов в Django Admin, поскольку URL-адреса включают префиксный идентификатор, и 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 URL-адрес для редактирования объекта выглядит следующим образом:

Код: Выделить всё

http://admin.localhost:8000/family_tree/familytree/ft_5F5479ca65374d401d9466d57fc95e4072/change/
Однако это вызывает следующую ошибку:

Код: Выделить всё

invalid input syntax for type uuid: "ft_5F5479ca65374d401d9466d57fc95e4072"
Я понимаю, что это происходит потому, что администратор Django пытается запросить базу данных, используя префиксный идентификатор, но база данных ожидает необработанный UUID.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-objects
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»