Django Admin - Change Model Page - URLs with UUID instead of



我有一个BaseModel类,我所有的模型继承与uuid像这样:

class BaseModel(models.Model):
''' Extension of base model class '''

uuid = models.UUIDField(unique=True, default=uuid4, editable=False)
...

我怎样才能改变django的管理行为,这样我就可以使用对象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

最新更新