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
Вернуться на верх