用Claude Code从零搭建Django项目:宠物管理App开发实战
发布时间:2026/10/26 14:16:36 锦皓数字建站

“从零搭建新项目”这几个字看着很爽做完才知道真正难的从来不是写代码而是决定“到底要做什么、怎么做”。最近我用Claude Code从空目录搭完了一个宠物生命周期管理App从数据库建模到页面生成再到提醒逻辑主力都是这个终端里的AI编程工具。这篇文章不聊宏大概念就把一件事讲透如果你手里也有一个类似的业务想法怎么用Claude Code一步步变成能跑的App以及路上哪些坑最值得绕开。适合刚接触Claude Code的开发者也适合后端基础一般、想快速出Demo的产品同学。1. 项目立项为什么选中“宠物生命周期管理”这个切入口1.1 从零搭项目的通病不是语法难是信息架构难很多人打开编辑器面对空目录时卡住的不是不会写某行代码而是“不知道从哪下手”。宠物生命周期管理这个选题表面看是个小工具实际把一套标准业务系统的所有套路都覆盖了从基础档案到关联记录从时间计算到提醒触发还有统计页面。核心实体是宠物围绕它挂着疫苗、驱虫、体检、体重、就诊这些事件每条事件又带着“下次应该什么时候做”的时间约束。这就是典型的“实体—关联—事件—提醒”结构跟图书管理、社区活动、企业工单在底层一模一样。所以我在立项时给自己划了明确边界不做复杂权限不做多用户协作不做支付单家庭场景下能把宠物从幼年到老年全生命周期管理好就算达标。范围越小AI反而越好配合因为你给它的每一句需求都能被精确翻译成代码。如果一开始就喊“帮我做个全功能宠物平台”Claude Code大概率给你生成一套前后端分离的微服务大礼包结果跑都跑不起来。这也是我想强调的第一条经验AI编程工具最怕的不是笨而是你需求描述得含混。1.2 为什么选Claude Code当主力开发工具Claude Code和普通聊天式AI编程最大的区别是它跑在终端里能读写项目文件、执行shell命令、跨多个文件做修改而且会在上下文里持续维护“我们正在做什么、改到哪一步了”。普通对话式AI帮你生成一段代码已经是极限Claude Code可以直接把这段代码写进对应文件然后顺手执行测试命令告诉你结果改坏了还能自己回滚。这个差异在做新项目时尤其明显。搭Django项目要先建工程、改配置、同步数据库中间牵涉十几个文件的增删修改用复制粘贴的方式跟AI对话会累死人Claude Code则是全程自己动手。实际体验下来它就像一个特别听话、但偶尔会自信过头的同事你不需要提醒它“把代码贴到第几行”它自己会处理好。1.3 技术栈选定Django SQLite 轻量前端的理由本轮项目选的是Python 3.12加Django 5数据库用SQLite前端用Django模板加Bootstrap图表用Chart.js。有人会问既然都上AI了为什么不直接React加Node全家桶我的回答是项目目标决定了复杂度上限。Django自带ORM、Admin后台、表单处理和模板引擎这意味着用户增删改查这类基础功能几乎不用额外写接口HTML直接渲染天然适合快速出活。SQLite零配置不需要单独装数据库服务做完直接打包跑对Demo阶段完全够用。前端没有强行拆成前后端分离是因为单用户场景不需要多一层Node工程反而增加了Claude Code跨项目改代码的负担。整套选型围绕“最快跑通全流程”服务而不是“技术栈最时髦”。2. Claude Code从零上手安装、配置与编码环境2.1 安装Claude Code的两种方式与前置检查安装Claude Code之前先确认电脑上有Node.js环境版本建议18以上。终端里执行node -v看一眼如果没有装先去装一个Node版本管理工具比如nvm再装LTS版本的Node。这是最容易忽略的前置条件很多人卡在安装脚本报错其实不是工具的问题是基础环境版本太老。装好Node之后安装Claude Code最简单的方式是npm全局安装npm install -g anthropic-ai/claude-code装完执行claude --version能输出版本号就说明装好了。另一种方式是官方提供的自动安装脚本一条命令搞定但我个人更喜欢npm方式后续版本升级直接再跑一遍npm命令就行。Windows用户如果遇到PowerShell禁止运行脚本的报错可以用管理员身份执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned调整策略这是本地开发环境常见操作别在团队共用或服务器上随便改。第一次执行claude命令会进入登录流程。终端里会生成一个一次性链接用浏览器打开并授权再把返回的验证码贴回终端即可。登录成功后Claude Code会询问你是否允许它读取当前目录、执行命令建议在个人项目目录里给足权限一些命令执行前它还会再次确认这是它的安全机制。2.2 在VSCode里给Claude Code安排一个工作间Claude Code可以不依赖编辑器单独使用但我习惯在VSCode里配好环境一起开发。VSCode扩展市场里搜Claude Code装上官方扩展它会在侧边栏显示一个会话面板同时能高亮当前被AI修改的文件。最有用的是调试场景代码报错时选中报错信息右键发送给Claude Code它能直接拿到上下文去分析省掉大量手动复制粘贴。我同时还装了一个AI补全插件也就是大家都在说的Fitten Code。很多人问两个AI工具是不是功能重叠实际配合起来是互补的Claude Code负责跨文件、跨模块的重构和功能实现补全插件只在我手写代码时把重复样板补齐。你甚至可以再把Claude Code的某段输出贴到别的聊天AI里做二次探讨形成多AI协作。我的心得是每个模型都有自己的盲区遇到Claude Code反复改不对的问题换个模型问一嘴往往能给你一个新角度。2.3 第一次会话给Claude Code一份能看懂的需求文档我第一次尝试时直接说“帮我做一个宠物App”结果Claude Code很兴奋地给我生成了前后端分离、Docker容器、微服务路由项目膨胀得根本没法跑。后来改成结构化指令效果天差地别。给你一条可以直接抄的开幕词你是我的结对编程伙伴。我们要从零开发一个“宠物生命周期管理App”。 技术栈Python 3.12 Django 5 SQLite Django Templates Bootstrap。 业务目标用户可以录入宠物档案记录疫苗、驱虫、体检、体重等生命周期事件 系统根据事件的下次执行日期生成提醒。 本期范围单用户、无登录、无支付、无多端适配。 验收标准本地 runserver 后可以完成“新增宠物→添加疫苗记录→查看提醒→查看体重趋势”全流程。 请先说明你的理解确认后再动手。这段Prompt里有角色设定、技术栈、业务边界、验收标准和操作约束Claude Code拿到后不会自由发挥。如果你对某个条件不满意随时可以在会话里追加。同时建议在项目根目录建一个CLAUDE.md文件把技术栈、目录约定、代码风格、常用命令写进去Claude Code每次启动会自动读取相当于给了它一份长期记忆。我踩过这个坑不写CLAUDE.md每次开新会话都要重新交代背景而且在项目中期有一次上下文被截断重新开会话之后它连“我们在做什么项目”都忘了非常耽误事。3. 核心功能落地宠物档案、生命周期事件与提醒3.1 数据建模先想清楚实体再让AI动手好的项目骨架来自清晰的数据模型。我让Claude Code先生成项目的Django工程利用django-admin startproject和python manage.py startapp两个命令。这一步按经验要拆开做让它执行完一个命令停一下看清输出再继续因为Django的工程和App之间存在配置注册关系AI一口气连跑一串命令中间任何一步报错都会让它陷入混乱。原始的模型结构是这样一个核心宠物表class Pet(models.Model): SPECIES_CHOICES [ (dog, 狗狗), (cat, 猫咪), (other, 其他), ] GENDER_CHOICES [ (male, 公), (female, 母), ] name models.CharField(max_length50, verbose_name名字) species models.CharField(max_length10, choicesSPECIES_CHOICES, verbose_name物种) breed models.CharField(max_length50, blankTrue, verbose_name品种) birth_date models.DateField(verbose_name出生日期) gender models.CharField(max_length10, choicesGENDER_CHOICES, verbose_name性别) weight_kg models.DecimalField(max_digits5, decimal_places2, verbose_name当前体重) avatar models.ImageField(upload_toavatars/, blankTrue, verbose_name头像) created_at models.DateTimeField(auto_now_addTrue, verbose_name建档时间)宠物档案为什么单独建表因为后面所有事件都通过外键关联到宠物ID这样查询某只宠物的疫苗记录、体检记录时一条pet.events.filter(...)就能搞定。Claude Code生成代码时我会要求它同时把verbose_name写上中文Django Admin后台能直接显示中文标签方便后续在后台看数据。生命周期事件表设计成通用事件表而不是每类事件各建一张表class LifeEvent(models.Model): EVENT_TYPES [ (vaccine, 疫苗), (deworm, 驱虫), (checkup, 体检), (grooming, 美容), (surgery, 手术), (weight, 体重), (other, 其他), ] pet models.ForeignKey(Pet, on_deletemodels.CASCADE, related_nameevents) event_type models.CharField(max_length20, choicesEVENT_TYPES, verbose_name事件类型) title models.CharField(max_length100, verbose_name事件标题) event_date models.DateField(verbose_name发生日期) next_due_date models.DateField(nullTrue, blankTrue, verbose_name下次日期) notes models.TextField(blankTrue, verbose_name备注) created_at models.DateTimeField(auto_now_addTrue)用一张通用事件表的好处是扩展性强今后无论增加什么新类型只要在EVENT_TYPES里加一个选项就行不需要新开表缺点是查询特定类型时要带event_type条件。对这个体量的项目来说通用模型加外键关联是明显更优解。这里也体现出Claude Code做技术的思路给它看场景让它提出建模方案我再判断比直接让它无脑写代码可靠得多。3.2 用Claude Code跑完迁移和Admin注册模型定义好之后接下来是逐步命令python manage.py makemigrations python manage.py migrate python manage.py createsuperuser我习惯让Claude Code依次执行并且每步都打印输出。实际遇到过一个坑AI在makemigrations之后没有执行migrate就直接去写视图了导致运行测试时报“表不存在”。所以我会明确要求它“执行完迁移命令后停顿等我确认再继续”。如果你把操作权限完全交给Claude Code它有时确实会自动跳过看起来与“写代码”无关的步骤——这是我用下来比较有感触的一点AI写代码没错但全流程把关还得人来做。注册Admin也是容易被跳过的操作。注册之后能直接在/admin/路径下手工添加数据相当于白拿一个后台管理界面对早期数据验证非常有用。让Claude Code在admin.py里注册Pet和LifeEvent两个模型然后启动runserver打开后台确认能增删改查这一步完成项目的地基就算打牢了。3.3 疫苗提醒和体重趋势把业务逻辑讲给AI听提醒功能是本项目的核心亮点。需求是这样的每一条生命周期事件都带有可选的“下次日期”系统需要告诉用户“哪只宠物在未来30天内有哪些事项要做”。为了让Claude Code写出正确逻辑我用业务语言把规则描述得尽量精确提醒范围从今天开始未来30天内到期的事件包括已经过期但还没完成的事件因为过期不代表不做。 排序规则按到期日从早到晚排列过期的最靠前。 展示位置首页顶部用卡片形式展示数量限制在10条以内。Claude Code按这个规则实现后核心查询逻辑类似这样from django.utils import timezone from datetime import timedelta from django.db.models import Q today timezone.localdate() expired Q(next_due_date__lttoday) within_days Q(next_due_date__gtetoday, next_due_date__ltetoday timedelta(days30)) upcoming_events LifeEvent.objects.filter( Q(pet__is_activeTrue), expired | within_days, next_due_date__isnullFalse, ).order_by(next_due_date)[:10]至于体重趋势我单独建了一张体重记录表记录日期和体重数值class WeightRecord(models.Model): pet models.ForeignKey(Pet, on_deletemodels.CASCADE, related_nameweight_records) date models.DateField() weight_kg models.DecimalField(max_digits5, decimal_places2) created_at models.DateTimeField(auto_now_addTrue)然后在宠物详情页让Claude Code写一个视图把体重数据序列化成JSON传给Chart.js画折线图。体重趋势展示的是一段时间内宠物健康状态的重要参考比单单记录“当前体重”对用户有说服力得多。这里不建议在普通视图里硬编码图表数据Claude Code生成一个返回JSON的接口再加一小段JS即可逻辑清晰。3.4 页面迭代从Admin样板到客户能用的界面数据模型和核心逻辑完成后剩下就是页面。我的做法是先用Django模板做三个页面宠物列表页、宠物详情页、事件新增页。列表页展示宠物名字、物种、年龄、下次待办数量详情页展示档案信息、事件时间线、体重图表新增页做疫苗和体重两个事件入口。样式直接用Bootstrap的CDN让Claude Code按“卡片式布局”“移动优先”的要求改CSS。这一段是Claude Code效率最高的时候。我给它一个描述比如“宠物详情页要有时间线按日期倒序显示所有生命周期事件让用户一眼看出最近发生了什么”它就能自己补完模板代码和对应的视图上下文。但我发现一个规律AI生成的页面经常缺少空状态提示。当数据库空空如也时页面直接白屏用户不知道该做什么。所以我在每次页面迭代里都补一句“同时也指写义提示语比如‘还没有任何疫苗记录点击右上角添加’”。这种细节才是产品能否用起来的分水岭。4. 实操要点AI编程提示词怎么写才能让Claude Code老实干活4.1 用“背景目标约束验收”四段式把话说全在几次翻车后我总结出一套固定的提示词模板每次给Claude Code下任务前默念四段式背景、目标、约束、验收。背景告诉它现在项目处于什么阶段比如“Django工程已建好Pet模型已迁移但LifeEvent模型还没有绑定视图”。目标说清楚这次要完成什么具体功能比如“在Home页面显示未来30天内到期的LifeEvent列表按到期时间排序”。约束是最关键的比如“不要改动Pet模型的字段”“不要加新依赖”“沿用现有Bootstrap样式”。验收用一句话说明“做到什么样算完成”比如“访问Home页面能看到5条测试数据点击事件标题能跳转详情页”。这四段里约束是大家最容易漏掉的。我让Claude Code很多时候跑偏就是因为只给了目标和背景它自主决定重新建了一张表、改了一堆无关配置。有了约束它的自由度就被框在了合理范围内。4.2 把大任务拆成“一个指令干一件事”Claude Code虽说是多文件操作工具但它对复杂任务的理解也是有上限的。我试过一次性要求它“把宠物详情页做到完美”结果它连续改了十几个文件最后页面崩了因为依赖了还没安装的前端库。后来改成一条指令干一件事“给Pet模型增加is_active字段并生成迁移。”“在Pet列表页卡片上显示年龄按birth_date计算。”“新增一个视图返回WeightRecord的JSON数据。”“在宠物详情页引入Chart.js画体重折线图。”每做完一步我会快速验证或者看一眼代码再给下一条指令。这样做的另一个好处是如果某一步AI改错了回滚成本很低不用面对一团乱麻。真正高效的AI协作模式不是把整个项目一次性甩给它而是你当好架构师它当好执行者指令颗粒度越细产出越稳。4.3 常见翻车点与恢复策略速查语气说“你给我重做”下面表格是我实际踩过的坑和修复手段。翻车现象原因恢复指令生成了大量无用代码工程结构越来越乱初始指令目标描述太宏大“先把新增的文件清单列给我并把明显无关的文件删除。”修改文件时插入重复代码块上下文太长逻辑开始混乱“找到与刚才重复的代码块并删掉只保留最新版本。”执行了错误的shell命令比如用pip装错包命令环境不一致“先告诉我你准备执行什么命令我确认后再执行。”上下文截断后忘记了项目约定没有CLAUDE.md或者会话太长把CLAUDE.md贴给它重新开场“读一下项目说明继续未完成的功能。”页面报错但AI找不到根源报错发生在前端AI只看后端“把浏览器控制台里的报错信息贴给你定位是模板变量还是JS问题。”我心里非常清楚的一点是Claude Code不是不需要人相反它对人的要求变高了。你需要清楚自己在做什么、全局是什么样、每一步改动的目的是什么。它放大的是你的工程能力而不是替你拥有工程能力。5. 测试、联调与发布准备5.1 让Claude Code生成自动化测试而不是人肉测试很多新手做完功能就觉得完事了实际上让Claude Code帮你写一版测试能省掉后续反复改bug的无数个小时。我在项目里让它用Django的TestCase补了三个测试场景from django.test import TestCase from django.utils import timezone from datetime import timedelta from .models import Pet, LifeEvent class LifeCycleTestCase(TestCase): def setUp(self): self.pet Pet.objects.create( name旺财, speciesdog, birth_datetimezone.localdate() - timedelta(days365), gendermale, weight_kg8.50, ) def test_create_vaccine_event(self): event LifeEvent.objects.create( petself.pet, event_typevaccine, title狂犬疫苗, event_datetimezone.localdate(), next_due_datetimezone.localdate() timedelta(days365), ) self.assertEqual(self.pet.events.count(), 1) self.assertEqual(event.next_due_date, timezone.localdate() timedelta(days365)) def test_upcoming_events_include_overdue(self): LifeEvent.objects.create( petself.pet, event_typedeworm, title体内驱虫, event_datetimezone.localdate() - timedelta(days60), next_due_datetimezone.localdate() - timedelta(days30), ) today timezone.localdate() upcoming LifeEvent.objects.filter( next_due_date__lttoday ) | LifeEvent.objects.filter( next_due_date__gtetoday, next_due_date__ltetoday timedelta(days30), ) self.assertEqual(upcoming.count(), 1)让AI生成测试的时候尤其要说一句“测试数据用setUp方法准备不要依赖外部数据库”这样测试可重复性才有保障。跑python manage.py test确认全绿后才算这个功能闭环了。测试一方面验证逻辑另一方面也倒逼Claude Code解释它的实现思路等于多一道审查。5.2 全流程验收用真实数据踩一遍用户路径自动化测试过了不代表能交付因为页面交互和数据库字段之间的衔接测试未必覆盖得到。我按“用户真实路径”做了一遍手工验收新增宠物“旺财”填写出生日期1岁、体重8.5公斤确认列表页出现正确年龄和体重。给旺财添加一条狂犬疫苗记录下次日期设为今天加7天回首页确认提醒卡片出现。再添加一条疫苗记录下次日期设为昨天确认过期提醒排在未过期提醒之前。连续添加4条体重记录确认详情页Chart.js折线图按日期正确显示上升趋势。编辑宠物档案修改体重确认详情页的当前体重同步更新。这套验收跑下来发现过两个问题一是年龄计算在生日尚未到来的情况下多算了1岁二是提醒卡片没有处理空数据的场景。都是小问题但真用户一定会遇到。所以我的建议是AI生成的代码一定按用户视角把所有路径走一遍再上线。5.3 部署方案选择的个人建议单用户Demo阶段的宠物App部署不用上K8s那套重型方案。最简单的方式是把项目跑在一台有Python环境的轻量云服务器上使用manage.py runserver确实够做演示但不能长久正规一点用Gunicorn加Nginx把静态文件收集到STATIC_ROOT再配置一下转发。另一个省心路线是用PaaS平台直接部署Django应用连数据库迁移都能在启动命令里自动执行适合不想折腾运维的场景。部署阶段Claude Code依然能帮忙让它生成Dockerfile或者平台配置模板还可以让它核对settings.py里的ALLOWED_HOSTS和DEBUG开关。这里有个重要的坑生产环境一定记得把DEBUG设为False否则访问出错页会直接暴露源码路径这是基础安全问题。Claude Code生成部署配置时我特别强调了这一点它就会在启动命令里自动做环境变量切换。6. 多AI协作与后续扩展6.1 Claude Code不是唯一工具组合拳效率更高我实际工作中把Claude Code当成主力但并不是唯一。遇到Claude Code解决不了的具体问题比如某个Django模板过滤器的写法细节我会把片段贴给DeepSeek或者Kimi这类对话式AI换个模型往往有不同思路。用补全插件做行级补齐用Claude Code做项目级重构再用聊天式AI做方案探讨——这就是我目前总结出的“多AI协作”模式。多AI协作的底线是版本管理。我要求Claude Code每完成一个功能就提示我提交一次git,这样可以任意回滚。两个AI工具不要同时改同一个小范围文件否则一版乱改一版没改最后很难判断谁是谁非。AI工具越多人越要当好“把关人”角色别把自己的代码仓拱手交给一堆模型乱炖。6.2 从宠物App提炼“AI从零搭项目”的通用方法论做完这个项目我最大的感受是Claude Code让我把精力从“体力活”里解放了出来但前期的需求分析和信息架构反而变得更重要。宠物生命周期管理的背后是“核心实体—事件记录—时间提醒—统计展示”四层结构。这套东西完全可以套在其他项目中实体会员卡事件是消费记录提醒是余额不足统计是月度账单实体是书事件是借阅提醒是还书日期统计是阅读偏好。模板一旦打通后续换实体只是换字段而已。所以如果你想用Claude Code做自己的项目别急着问“它能不能帮我写这个App”先问“我能不能把一个模糊想法拆成数据模型、事件流、提醒规则、展示页四块”。如果能剩下的事情交给Claude Code你只需要当好那个说清需求和把关质量的人。最后再分享一个小技巧项目做完后我会花十分钟让Claude Code把整个项目的目录结构和关键代码逻辑写进CLAUDE.md。别小看这一步你过两周再打开这个项目AI可以通过这份文档快速恢复状态你自己也不会对着满屏代码怀疑人生。工具在迭代但“先把问题想清楚再动手”这件事永远值得多花时间。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。