尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
零基础入门python34:Django Admin——给运营人员一个可用后台
零基础入门python34Django Admin——给运营人员一个可用后台一、上一篇课后练习讲解库存小于 5 的查询使用Product.objects.filter(stock__lt5, is_activeTrue)测试应准备一个库存 4 和一个库存 10 的商品断言只返回前者。上一篇课后练习完整答案上一篇练习的要求已落实到下面完整文件先运行项目测试再用 curl 对照状态码和数据库持久化结果答案要点visible_products 通过 Q 组合关键词与库存筛选select_related 消除 N1assertNumQueries 固定查询预算。文件shop/queries.py完整参考答案文件完整文件shop/queries.pyfromdjango.db.modelsimportQfrom.modelsimportProductdefvisible_products(params):qsProduct.objects.filter(is_activeTrue).select_related(category)ifparams.get(q):qparams[q];qsqs.filter(Q(name__icontainsq)|Q(category__name__icontainsq))ifparams.get(low_stock):qsqs.filter(stock__lt5)returnqs.order_by(id)完整参考答案文件本篇对应的交付源码完整文件django-shop/shop/models.pyfromdjango.confimportsettingsfromdjango.dbimportmodelsclassCategory(models.Model):namemodels.CharField(max_length60,uniqueTrue)slugmodels.SlugField(max_length60,uniqueTrue)def__str__(self):returnself.nameclassProduct(models.Model):categorymodels.ForeignKey(Category,on_deletemodels.PROTECT,related_nameproducts)namemodels.CharField(max_length120)slugmodels.SlugField(max_length120,uniqueTrue)pricemodels.DecimalField(max_digits10,decimal_places2)stockmodels.PositiveIntegerField(default0)is_activemodels.BooleanField(defaultTrue)created_atmodels.DateTimeField(auto_now_addTrue)def__str__(self):returnself.nameclassOrder(models.Model):classStatus(models.TextChoices):PENDINGpending,待处理PAIDpaid,已支付CANCELLEDcancelled,已取消usermodels.ForeignKey(settings.AUTH_USER_MODEL,on_deletemodels.PROTECT,related_nameorders)statusmodels.CharField(max_length20,choicesStatus.choices,defaultStatus.PENDING)total_amountmodels.DecimalField(max_digits12,decimal_places2,default0)created_atmodels.DateTimeField(auto_now_addTrue)classOrderItem(models.Model):ordermodels.ForeignKey(Order,on_deletemodels.CASCADE,related_nameitems)productmodels.ForeignKey(Product,on_deletemodels.PROTECT)product_namemodels.CharField(max_length120)pricemodels.DecimalField(max_digits10,decimal_places2)quantitymodels.PositiveIntegerField()验收命令python -m pytest -qDjango 项目使用 python manage.py test。预期测试通过若失败先检查迁移、配置和事务回滚。二、本篇完成什么注册 Category、Product、Order 和 OrderItem 到 Admin让运营人员可以搜索商品、筛选上下架状态和查看库存而不修改公开 API。三、ModelAdmin配置admin.register(Product)classProductAdmin(admin.ModelAdmin):list_display(name,category,price,stock,is_active)list_filter(is_active,category)search_fields(name,slug)list_editable(price,stock,is_active)list_display让运营一眼看到关键信息list_filter适合枚举和外键search_fields生成参数化搜索。list_editable虽然方便但生产环境应谨慎开放库存直接编辑库存变化最好走有审计的业务服务。四、验收python manage.py createsuperuser python manage.py runserver登录/admin/新增分类和商品使用搜索和筛选确认公开商品接口能读到刚才的数据。课后练习在 Admin 中增加只读的创建时间字段并说明为什么订单金额不能由运营随意改写。项目增量Admin 不是随便注册模型Admin 是运营人员维护商品的工作台。list_display、search_fields、list_filter 和 readonly_fields 要围绕实际操作设计密码、订单金额等敏感字段不能随意开放编辑。admin.register(Product)classProductAdmin(admin.ModelAdmin):list_display(name,category,price,stock,is_active)search_fields(name,slug)list_filter(is_active,category)验收管理员登录、搜索商品、筛选库存和修改价格普通用户不能访问 admin。课后练习增加自定义库存低于 5 的过滤器。五、上一篇练习详情页查询次数固定上一章的详情 API 要使用select_related(category)测试中用assertNumQueries(1)固定性能基线。若后续增加标签等多对多字段查询次数可以变成 2但不能随着商品数量线性增长。先测量再优化不要凭感觉到处加select_related。六、把 Admin 做成运营工作台admin.register(Product)classProductAdmin(admin.ModelAdmin):list_display(name,category,price,stock,is_active)list_select_related(category,)search_fields(name,slug,category__name)list_filter(is_active,category,StockLowFilter)readonly_fields(created_at,updated_at)prepopulated_fields{slug:(name,)}defsave_model(self,request,obj,form,change):# Admin 也必须经过领域校验不能因为是内部页面就允许负库存。ifobj.stock0:raiseValidationError(库存不能为负数)super().save_model(request,obj,form,change)list_select_related避免列表中每行读取分类产生 N1readonly_fields防止运营修改审计时间prepopulated_fields只是输入辅助真正的 slug 唯一性仍由数据库保证。订单金额不应放入商品 Admin 直接编辑因为订单项保存了价格快照改商品价格不应改变历史订单。七、自定义低库存过滤器classStockLowFilter(admin.SimpleListFilter):title库存状态parameter_namestock_statusdeflookups(self,request,model_admin):return((low,低于 5),(empty,已售罄))defqueryset(self,request,queryset):ifself.value()low:returnqueryset.filter(stock__lt5,stock__gt0)ifself.value()empty:returnqueryset.filter(stock0)returnqueryset过滤器返回新的 QuerySet不在 Python 中循环判断。把stock_status拼进模板或 SQL 都不安全Admin 的queryset会为参数化查询负责。八、验收、错误排查与本篇练习python manage.py createsuperuser python manage.py runserver登录/admin/搜索“Python”筛选“低于 5”确认分类只查询一次。若 Admin 页面 403检查用户is_staff若时间字段仍可编辑确认readonly_fields写的是模型字段名若搜索时报Cannot resolve keyword说明search_fields的关联字段拼写错误。本篇练习在 Admin 增加一个“批量下架” action并记录操作人禁止批量修改价格。下一篇将把 Django 认证和订单权限分开讲解。十、Admin 与公共 API 的边界Admin 适合内部运营不应直接当作移动端 API它返回 HTML、权限模型是 staff、字段展示可以随时调整。公共 API 使用 DRF Serializer 固定 JSON 契约。两者都调用同一个 service 修改商品保证库存校验和审计规则不因入口不同而失效。本篇结束完整模块文件下面是交付项目中真实存在的完整文件 django-shop/shop/admin.py。它覆盖本篇新增逻辑以及前文已经完成的依赖代码复制单个函数会丢失上下文因此这里提供整份文件。fromdjango.contribimportadminfrom.modelsimportCategory,Order,OrderItem,Productadmin.register(Category)classCategoryAdmin(admin.ModelAdmin):list_display(name,slug)prepopulated_fields{slug:(name,)}admin.register(Product)classProductAdmin(admin.ModelAdmin):list_display(name,category,price,stock,is_active)list_filter(is_active,category)search_fields(name,)prepopulated_fields{slug:(name,)}classOrderItemInline(admin.TabularInline):modelOrderItem extra0readonly_fields(product,product_name,price,quantity)admin.register(Order)classOrderAdmin(admin.ModelAdmin):list_display(id,user,status,total_amount,created_at)list_filter(status,)inlines(OrderItemInline,)
RELATED

相关推荐

零基础入门python37:订单和订单项——为什么要保存价格快照

零基础入门python37:订单和订单项——为什么要保存价格快照

零基础入门python37:订单和订单项——为什么要保存价格快照一、上一篇课后练习讲解 购物车数量接口应读取当前数量后加减,并限制结果在 1 到库存之间;不要让客户端直接提交一个超过库存的最终值而跳过校验。 上一篇课后练习完整答案 上一篇练…

📅 2026/11/9 19:53:45
软件核心资产化安全加固软件的技术路径与实践思考北京市圣天地

软件核心资产化安全加固软件的技术路径与实践思考北京市圣天地

在数字化业务全面渗透的当下,软件开发商、AI技术服务商及企业应用运营方普遍面临核心资产安全威胁:自研代码可能被逆向工程拆解,正版安装包存在非法盗版分发的风险,大模型权重参数可能遭受恶意篡改,高价值数据文件亦可…

📅 2026/10/6 8:18:05
彻底搞懂 IT 中的 Schema(模式/架构):全场景通解(数据库、JSON、后端、AI、RAG)

彻底搞懂 IT 中的 Schema(模式/架构):全场景通解(数据库、JSON、后端、AI、RAG)

一、Schema 核心定义(一句话吃透)Schema 中文:模式 / 架构 / 数据模板本质:一套「数据结构规范」提前定义:数据有哪些字段、字段类型、是否必填、取值范围、层级结构、约束规则。通俗终极比喻:Schema 空白…

📅 2026/10/7 5:22:19
MORE NEWS

更多资讯

📰

廊坊本地考电工证多久拿证 实操考试心里没底怕挂科

廊坊本地考电工证多久拿证 实操考试心里没底怕挂科 实操考试心里没底怕挂科,这是大多数第一次报考电工证的学员最真实的感受。尤其是像你这样的南阳卧龙区学员,可能对考试流程、题型、实操操作都不熟悉,担心一不小心就挂科。但别担心,只要掌握好备考方法…

📰

你之前考的证在外省能不能转过来?无锡市考高压电工证真实经历揭秘

你之前考的证在外省能不能转过来?无锡市考高压电工证真实经历揭秘 之前考的证在外省能不能转过来?这几乎是每个准备考高压电工证的工友最先问的问题。我有个同事小李,就是从河南来的,他在郑州考的高压电工证,后来到无锡打工,发现证书在本地不能直接使用…

📰

汝州考电工证在哪里 一个真实经历告诉你别走弯路

汝州考电工证在哪里 一个真实经历告诉你别走弯路 你是不是也和我一样, 不知道去哪报名怕被中介坑 ?刚听说要在汝州考电工证,结果一查信息就头晕,网上一堆培训机构,价格参差不齐,还有的连资质都没有,真怕一不小心就被坑了。我就有个朋友,当初为了省…

📰

廊坊本地考电工证千万别踩坑,工地太忙根本没时间复习考试

廊坊本地考电工证千万别踩坑,工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多一线电工的真实写照。很多人在一线干了多年,但因为没有电工证,不仅影响职业发展,还可能面临被处罚的风险。更让人头疼的是, 廊坊本地考电工证…

📰

永川职教中心电工证通过率揭秘:考不过白交钱?真相在这

永川职教中心电工证通过率揭秘:考不过白交钱?真相在这 怕考不过白交培训费?永川职教中心电工证报考前你必须知道的真相, 通过率揭秘 就在这里!别再被培训机构忽悠,咱们今天就来聊聊怎么稳稳拿下电工证,不走弯路,不花冤枉钱!…

📰

弱电电工证操作电压千万别踩坑:新乡水利工程从业者必看备考攻略

弱电电工证操作电压千万别踩坑:新乡水利工程从业者必看备考攻略 你是不是正为找工作发愁?手里缺个特种作业证,企业一问“有证吗”,你就只能摇头?弱电电工证操作电压这事儿,不是你想考就能考,也不是你想过就能过的,稍有不慎,钱花了、时间耗了,证还拿…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬