Django Admin - Страница изменения модели - URL с UUID вместо ID
У меня есть класс BaseModel
, который наследуют все мои модели с uuid
примерно так:
class BaseModel(models.Model):
''' Extension of base model class '''
uuid = models.UUIDField(unique=True, default=uuid4, editable=False)
...
Как я могу изменить поведение django admin так, чтобы я мог получить доступ к странице изменений для экземпляра, используя UUID объекта вместо ID?
В настоящее время:
.../admin/my_app/my_model/7/change/
Предпочтительно:
.../admin/my_app/my_model/b6a98f1d-6b26-4399-8d68-62ec1ce12c41/change/
Мне удалось решить эту проблему без необходимости устанавливать UUID
в качестве первичного ключа:
from django.contrib import admin
class BaseModelAdmin(admin.ModelAdmin):
""" base model admin with custom behavior """
def get_object(self, request, object_id, from_field=None):
""" get object based on uuid insead of id """
# get queryset, model, field:
queryset = self.get_queryset(request)
model = queryset.model
field = model._meta.get_field('uuid') if from_field is None else model._meta.get_field(from_field)
# try to return instance:
try:
object_id = field.to_python(object_id)
return queryset.get(**{field.name: object_id})
except:
return None