您可以覆盖管理员的queryset-方法以仅显示用户的项目:
def queryset(self, request):
user = getattr(request, 'user', None)
qs = super(MyAdmin, self).queryset(request)
if user.is_superuser:
return qs
return qs.filter(user=user)
此外,您还应该注意has_change_permission 和has_delete_permission 方法,例如:
def has_delete_permission(self, request, obj=None):
if not request.user == obj.user and not request.user.is_superuser:
return False
return super(MyAdmin, self).has_delete_permission(request, obj)
has_change_permission 也一样!
list_select_related 仅在获取管理员的查询集以立即从关系中获取相关数据时使用,而不是在需要时使用!
如果您的主要目标只是限制用户无法使用其他对象,则上述方法将起作用,如果它变得越来越复杂并且您不能简单地从 ONE 属性(如用户)中判断权限,则查看 django 的行级权限提案!