一、企业级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,说不定能解决你之前遇到的很多麻烦。