一、企业级Web平台数据管理的痛点
很多做企业级Web平台的人,应该都遇到过数据管理的麻烦:比如平台上线后,要给员工加权限、改商品库存、查用户订单,要么得找开发改代码,要么得用一堆零散的工具,不仅慢还容易出错。之前我帮一家做SaaS服务的客户做后台,他们之前用的是自己写的简易后台,每次改一个商品分类,都要等开发排期,快的话半天,慢的话两三天,业务部门天天催。后来换了Django Admin,改分类只要点几下鼠标,几分钟就能搞定,效率提升特别明显。
企业级数据管理的核心需求其实很简单:安全、快速、能适配业务变化。安全是说不能随便让不该碰数据的人看到敏感信息,比如财务数据只能财务看;快速是说业务调整的时候,不用等开发改核心代码,自己就能操作;适配变化是说业务变了,比如新增了会员等级、新的订单类型,后台能跟着改,不用重构。
二、Django Admin的核心优势:开箱即用的企业级数据管理
Django Admin是Django框架自带的后台管理工具,不用额外装复杂的组件,只要你的项目是用Django搭的,配置一下就能用。它的核心优势有三个: 第一,自带权限体系。企业里不同角色的人,权限完全不一样,比如运营能改商品,财务能看订单但不能改,管理员能给别人加权限。Django Admin不用自己写权限控制的代码,配置一下就能实现,避免了自己写权限容易出的漏洞。 第二,自动生成后台页面。只要你在Django里定义了数据库模型(就是对应数据库里的表),它会自动生成对应的增删改查页面,不用自己写HTML、CSS、JS,省了好多前端开发的活。 第三,高度可定制。如果默认的页面不符合业务需求,比如要给某个数据加一个批量操作的按钮,或者要在列表页显示更多信息,都能自己改,不会被框架限制死。
三、完整示例:用Django Admin管理电商平台数据
接下来用一个具体的例子,一步步讲怎么用Django Admin管理企业级数据。这个例子是一个电商平台,需要管理商品、订单、用户三个核心数据,涵盖权限控制、定制后台、批量操作这些常用功能。
3.1 技术栈说明
所有示例统一使用Django 4.2(Python 3.10),不涉及其他框架,确保环境统一。
3.2 第一步:搭建基础Django项目
首先得有一个基础的Django项目,先装Django:
# 安装指定版本的Django,避免版本兼容问题
pip install django==4.2
然后创建项目和应用:
# 创建Django项目,项目名叫ecommerce
django-admin startproject ecommerce
# 进入项目目录
cd ecommerce
# 创建应用,应用名叫shop,用来管理商品、订单、用户
python manage.py startapp shop
3.3 第二步:定义数据库模型
模型就是对应数据库里的表,Django会根据模型自动生成数据库结构。在shop/models.py里写模型:
from django.db import models
from django.contrib.auth.models import User
# 商品模型,对应商品表
class Product(models.Model):
name = models.CharField(max_length=100, verbose_name='商品名称') # 中文显示名,后台会用
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格') # 价格,保留两位小数
stock = models.IntegerField(verbose_name='库存') # 库存数量
is_active = models.BooleanField(default=True, verbose_name='是否上架') # 商品是否在售
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') # 自动记录创建时间
class Meta:
verbose_name = '商品' # 后台显示的模型名(单数)
verbose_name_plural = '商品' # 后台显示的模型名(复数)
def __str__(self):
return self.name # 后台显示对象时用商品名称,不用默认的Product object
# 订单模型,对应订单表
class Order(models.Model):
STATUS_CHOICES = [
('pending', '待付款'),
('paid', '已付款'),
('shipped', '已发货'),
('completed', '已完成'),
('cancelled', '已取消'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='下单用户') # 关联系统用户
product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='购买商品') # 关联商品
quantity = models.IntegerField(verbose_name='购买数量') # 购买数量
total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='总金额') # 订单总金额
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='订单状态') # 订单状态
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') # 自动记录创建时间
class Meta:
verbose_name = '订单'
verbose_name_plural = '订单'
def __str__(self):
return f'订单-{self.id}-{self.user.username}' # 后台显示订单时用这个格式
模型写完后,要告诉Django这个应用存在,在ecommerce/settings.py里的INSTALLED_APPS里加上'shop':
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'shop', # 新增的应用,必须加在这个列表里
]
然后生成数据库迁移文件,创建数据库表:
# 生成迁移文件,Django会根据模型变化生成要改数据库的指令
python manage.py makemigrations
# 执行迁移,把指令应用到数据库,创建表
python manage.py migrate
3.4 第三步:配置Django Admin,实现基础管理
接下来要让Django Admin能管理我们定义的模型。在shop/admin.py里配置:
from django.contrib import admin
from .models import Product, Order
# 注册商品模型到后台
admin.site.register(Product)
# 注册订单模型到后台
admin.site.register(Order)
然后创建超级管理员账号,用来登录后台:
# 执行命令后按提示输入用户名、邮箱、密码
python manage.py createsuperuser
启动项目:
python manage.py runserver
打开浏览器访问http://127.0.0.1:8000/admin,用刚才创建的超级管理员账号登录,就能看到商品和订单的管理入口了。这时候已经能实现基础的增删改查,但还不符合企业级的需求,比如运营不能改订单,财务不能改商品,批量改库存这些功能都没有。
3.5 第四步:定制后台,适配企业级需求
企业级的后台肯定不能这么简单,接下来要做三个定制:权限控制、定制列表页、批量操作。
3.5.1 权限控制:给不同角色分配不同权限
比如我们要做三个角色:运营(能管理商品,不能碰订单)、财务(能看订单,不能改)、管理员(能管所有)。Django Admin自带权限体系,不用自己写代码,只要配置一下。
首先在后台创建角色:登录超级管理员账号,找到“组”,点击添加。
- 创建“运营组”:在权限里找到“商品”相关的权限(可以添加商品、可以修改商品、可以删除商品、可以查看商品),保存。
- 创建“财务组”:在权限里找到“订单”的“可以查看订单”权限,保存。
然后给用户分配组:找到“用户”,添加新用户(比如运营的账号叫yunying,财务的账号叫caiwu),创建完后,在用户的“组”里把yunying加到运营组,把caiwu加到财务组。
现在用yunying账号登录后台,只能看到商品的管理入口,看不到订单;用caiwu账号登录,只能看到订单,而且不能改订单,只能看,完全符合需求。
3.5.2 定制列表页:显示更多信息,支持搜索过滤
默认的商品列表页只显示商品名称,我们要加价格、库存、是否上架,还要支持按价格范围、库存范围搜索,按是否上架过滤。修改shop/admin.py里的ProductAdmin:
from django.contrib import admin
from .models import Product, Order
# 定制商品的后台管理类
class ProductAdmin(admin.ModelAdmin):
# 列表页显示的字段,顺序就是显示的顺序
list_display = ['name', 'price', 'stock', 'is_active', 'created_at']
# 可以点击这些字段排序,比如点击价格就能按价格升序/降序排
list_display_links = ['name']
# 列表页顶部的过滤条件,按是否上架过滤
list_filter = ['is_active']
# 可以搜索的字段,按商品名称搜索
search_fields = ['name']
# 列表页的批量操作动作
actions = ['mark_as_active', 'mark_as_inactive']
# 批量上架商品的动作
def mark_as_active(self, request, queryset):
# queryset是选中的所有商品对象
queryset.update(is_active=True)
# 操作完成后给用户提示
self.message_user(request, f'成功将{queryset.count()}件商品设为上架')
mark_as_active.short_description = '批量上架选中商品' # 动作的显示名称
# 批量下架商品的动作
def mark_as_inactive(self, request, queryset):
queryset.update(is_active=False)
self.message_user(request, f'成功将{queryset.count()}件商品设为下架')
mark_as_inactive.short_description = '批量下架选中商品'
# 注册的时候用定制的管理类
admin.site.register(Product, ProductAdmin)
# 定制订单的后台管理类
class OrderAdmin(admin.ModelAdmin):
list_display = ['id', 'user', 'product', 'quantity', 'total_price', 'status', 'created_at']
list_filter = ['status', 'created_at'] # 按订单状态、创建时间过滤
search_fields = ['user__username', 'product__name'] # 按用户名、商品名称搜索
# 财务不能改订单,所以把修改按钮去掉
def has_change_permission(self, request, obj=None):
# 如果是财务组的用户,没有修改权限
if request.user.groups.filter(name='财务组').exists():
return False
# 其他用户(比如管理员)可以改
return super().has_change_permission(request, obj)
admin.site.register(Order, OrderAdmin)
修改完后刷新后台,商品列表页就会显示所有定制的字段,还有批量上架、下架的按钮;财务登录后台看订单,没有修改按钮,只能查看。
3.5.3 批量操作:批量调整库存
比如运营要给一批商品加库存,不用一个个改,只要批量操作。我们在ProductAdmin里加一个批量调整库存的动作:
# 先导入需要的模块
from django.contrib.admin import action
from django import forms
# 定义批量调整库存的表单,让用户输入要加的库存数量
class BulkStockForm(forms.Form):
stock_change = forms.IntegerField(label='库存调整数量(正为加,负为减)')
# 然后在ProductAdmin里加动作
class ProductAdmin(admin.ModelAdmin):
# 之前的配置不变
list_display = ['name', 'price', 'stock', 'is_active', 'created_at']
list_display_links = ['name']
list_filter = ['is_active']
search_fields = ['name']
actions = ['mark_as_active', 'mark_as_inactive', 'bulk_adjust_stock']
# 批量调整库存的动作
def bulk_adjust_stock(self, request, queryset):
# 第一次调用这个动作的时候,显示表单
if 'apply' not in request.POST:
# 把表单传给模板
context = {
'form': BulkStockForm(),
'action': 'bulk_adjust_stock',
'selected': queryset,
}
return admin.site.admin_view(self.change_view)(request, context=context)
# 第二次调用,用户提交了表单,处理数据
form = BulkStockForm(request.POST)
if form.is_valid():
stock_change = form.cleaned_data['stock_change']
# 批量更新库存,每个商品的库存加调整的数量
for product in queryset:
product.stock += stock_change
product.save()
self.message_user(request, f'成功调整{queryset.count()}件商品的库存,共调整{stock_change}')
bulk_adjust_stock.short_description = '批量调整选中商品的库存'
现在运营登录后台,选中要调整的商品,点击“批量调整选中商品的库存”,会弹出一个输入框,输入要加的数量,提交后所有选中的商品库存就会一起改,不用一个个操作,效率特别高。
四、企业级应用场景分析
Django Admin适合的企业级场景主要有三类: 第一类是内部管理平台,比如员工管理、项目管理、财务报表管理,这类平台不需要太复杂的前端,只要能快速操作数据,Django Admin完全能满足,还能省好多开发时间。 第二类是业务支撑后台,比如电商的商品、订单管理,SaaS平台的客户管理、套餐管理,这类后台需要频繁调整数据,Django Admin的定制化能力能适配业务变化,不用等开发改核心代码。 第三类是数据监控后台,比如监控平台的指标数据、告警数据,Django Admin能快速把数据展示出来,还能加过滤、搜索功能,方便运维人员查看。
不适合的场景也有:如果你的后台需要特别复杂的交互,比如可视化的仪表盘、实时更新的图表,Django Admin的原生能力不够,需要额外开发,但如果只是数据管理,完全没问题。
五、技术优缺点与注意事项
5.1 优点
第一,开发速度快,只要定义模型,就能生成基础后台,定制也简单,不用自己写权限、增删改查的代码,比自己写后台快好几倍。 第二,安全可靠,Django的权限体系是经过大量项目验证的,不会有自己写权限容易出的漏洞,比如越权访问的问题。 第三,维护成本低,后续业务调整,只要改模型或者定制后台的配置,不用改核心业务代码,出问题也容易排查。
5.2 缺点
第一,定制的复杂度,虽然基础定制简单,但如果要做特别复杂的功能,比如自定义的页面、复杂的业务逻辑,可能会比用专门的后台框架麻烦。 第二,前端样式固定,默认的样式比较老,要是企业需要特别统一的品牌样式,可能需要额外改CSS,不过现在也有一些第三方的主题可以用。 第三,性能问题,如果数据量特别大,比如订单有几百万条,默认的后台可能会有点卡,需要自己优化,比如加缓存、分页。
5.3 注意事项
第一,不要把Django Admin直接暴露给公网,因为它是后台管理工具,容易被攻击,最好加一层身份验证,或者只在内部网络访问。 第二,敏感数据的处理,比如用户的密码、财务数据,要在后台配置不能显示明文,Django Admin默认会隐藏密码,但其他敏感数据要自己加过滤。 第三,权限控制要细,不要给用户多余的权限,比如运营不能改订单,财务不能改商品,避免误操作。 第四,定期备份数据库,因为后台操作会直接改数据库,万一误删了数据,有备份才能恢复。
六、文章总结
Django Admin不是一个特别复杂的工具,但对于企业级Web平台的数据管理来说,它是一个非常实用的选择。它能快速生成基础后台,自带安全的权限体系,还能根据业务需求定制,能帮企业节省大量的开发时间和成本,提升业务部门的工作效率。
从我们做的电商平台的例子就能看出来,只要定义好模型,配置一下,就能实现商品、订单的管理,还能定制权限、批量操作,完全满足企业级的需求。如果你的企业正在做Web平台,或者需要一个内部的管理后台,不妨试试Django Admin,说不定能解决你之前遇到的很多麻烦。
Comments