Я работаю над проектом 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 ... 72/change/
Однако это вызывает следующую ошибку:
invalid input syntax for type uuid: "ft_5F5479ca65374d401d9466d57fc95e4072"
Я понимаю, что это происходит потому, что администратор Django пытается запросить базу данных, используя идентификатор с префиксом, но база данных ожидает необработанный UUID.
originor__dev__app | Internal Server Error: /family_tree/familytree/ft_5F5479ca65374d401d9466d57fc95e4072/change/
originor__dev__app | Traceback (most recent call last):
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
originor__dev__app | return self.cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/psycopg/cursor.py", line 723, in execute
originor__dev__app | raise ex.with_traceback(None)
originor__dev__app | psycopg.errors.InvalidTextRepresentation: invalid input syntax for type uuid: "ft_5479ca65374d401d9466d57fc95e4072"
originor__dev__app | LINE 1: ...familytree" WHERE "family_tree_familytree"."id" = 'ft_5479ca...
originor__dev__app | ^
originor__dev__app |
originor__dev__app | The above exception was the direct cause of the following exception:
originor__dev__app |
originor__dev__app | Traceback (most recent call last):
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
originor__dev__app | response = get_response(request)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 197, in _get_response
originor__dev__app | response = wrapped_callback(request, *callback_args, **callback_kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 688, in wrapper
originor__dev__app | return self.admin_site.admin_view(view)(*args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
originor__dev__app | response = view_func(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/views/decorators/cache.py", line 62, in _wrapper_view_func
originor__dev__app | response = view_func(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/sites.py", line 242, in inner
originor__dev__app | return view(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1889, in change_view
originor__dev__app | return self.changeform_view(request, object_id, form_url, extra_context)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/utils/decorators.py", line 46, in _wrapper
originor__dev__app | return bound_method(*args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
originor__dev__app | response = view_func(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1747, in changeform_view
originor__dev__app | return self._changeform_view(request, object_id, form_url, extra_context)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1767, in _changeform_view
originor__dev__app | obj = self.get_object(request, unquote(object_id), to_field)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 866, in get_object
originor__dev__app | return queryset.get(**{field.name: object_id})
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 633, in get
originor__dev__app | num = len(clone)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 380, in __len__
originor__dev__app | self._fetch_all()
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1881, in _fetch_all
originor__dev__app | self._result_cache = list(self._iterable_class(self))
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 91, in __iter__
originor__dev__app | results = compiler.execute_sql(
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1562, in execute_sql
originor__dev__app | cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 102, in execute
originor__dev__app | return super().execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 67, in execute
originor__dev__app | return self._execute_with_wrappers(
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
originor__dev__app | return executor(sql, params, many, context)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
originor__dev__app | return self.cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 91, in __exit__
originor__dev__app | raise dj_exc_value.with_traceback(traceback) from exc_value
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
originor__dev__app | return self.cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/psycopg/cursor.py", line 723, in execute
originor__dev__app | raise ex.with_traceback(None)
originor__dev__app | django.db.utils.DataError: invalid input syntax for type uuid: "ft_5479ca65374d401d9466d57fc95e4072"
originor__dev__app | LINE 1: ...familytree" WHERE "family_tree_familytree"."id" = 'ft_5479ca...
originor__dev__app | ^
Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-objects
Как обрабатывать UUID с префиксом в администраторе Django для запроса и отображения объектов? ⇐ Python
Программы на Python
1737085535
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.
originor__dev__app | Internal Server Error: /family_tree/familytree/ft_5F5479ca65374d401d9466d57fc95e4072/change/
originor__dev__app | Traceback (most recent call last):
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
originor__dev__app | return self.cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/psycopg/cursor.py", line 723, in execute
originor__dev__app | raise ex.with_traceback(None)
originor__dev__app | psycopg.errors.InvalidTextRepresentation: invalid input syntax for type uuid: "ft_5479ca65374d401d9466d57fc95e4072"
originor__dev__app | LINE 1: ...familytree" WHERE "family_tree_familytree"."id" = 'ft_5479ca...
originor__dev__app | ^
originor__dev__app |
originor__dev__app | The above exception was the direct cause of the following exception:
originor__dev__app |
originor__dev__app | Traceback (most recent call last):
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
originor__dev__app | response = get_response(request)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 197, in _get_response
originor__dev__app | response = wrapped_callback(request, *callback_args, **callback_kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 688, in wrapper
originor__dev__app | return self.admin_site.admin_view(view)(*args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
originor__dev__app | response = view_func(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/views/decorators/cache.py", line 62, in _wrapper_view_func
originor__dev__app | response = view_func(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/sites.py", line 242, in inner
originor__dev__app | return view(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1889, in change_view
originor__dev__app | return self.changeform_view(request, object_id, form_url, extra_context)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/utils/decorators.py", line 46, in _wrapper
originor__dev__app | return bound_method(*args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
originor__dev__app | response = view_func(request, *args, **kwargs)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1747, in changeform_view
originor__dev__app | return self._changeform_view(request, object_id, form_url, extra_context)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1767, in _changeform_view
originor__dev__app | obj = self.get_object(request, unquote(object_id), to_field)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/options.py", line 866, in get_object
originor__dev__app | return queryset.get(**{field.name: object_id})
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 633, in get
originor__dev__app | num = len(clone)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 380, in __len__
originor__dev__app | self._fetch_all()
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1881, in _fetch_all
originor__dev__app | self._result_cache = list(self._iterable_class(self))
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 91, in __iter__
originor__dev__app | results = compiler.execute_sql(
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1562, in execute_sql
originor__dev__app | cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 102, in execute
originor__dev__app | return super().execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 67, in execute
originor__dev__app | return self._execute_with_wrappers(
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
originor__dev__app | return executor(sql, params, many, context)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
originor__dev__app | return self.cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 91, in __exit__
originor__dev__app | raise dj_exc_value.with_traceback(traceback) from exc_value
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
originor__dev__app | return self.cursor.execute(sql, params)
originor__dev__app | File "/usr/local/lib/python3.9/site-packages/psycopg/cursor.py", line 723, in execute
originor__dev__app | raise ex.with_traceback(None)
originor__dev__app | django.db.utils.DataError: invalid input syntax for type uuid: "ft_5479ca65374d401d9466d57fc95e4072"
originor__dev__app | LINE 1: ...familytree" WHERE "family_tree_familytree"."id" = 'ft_5479ca...
originor__dev__app | ^
Подробнее здесь: [url]https://stackoverflow.com/questions/79362392/how-to-handle-prefixed-uuids-in-django-admin-for-querying-and-displaying-objects[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия