☰
用Claude Code从零搭建Django项目:宠物管理App开发实战
2026/10/26 14:16:34 网站建设 项目流程

“从零搭建新项目”,这几个字看着很爽,做完才知道真正难的从来不是写代码,而是决定“到底要做什么、怎么做”。最近我用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_length=50, verbose_name='名字') species = models.CharField(max_length=10, choices=SPECIES_CHOICES, verbose_name='物种') breed = models.CharField(max_length=50, blank=True, verbose_name='品种') birth_date = models.DateField(verbose_name='出生日期') gender = models.CharField(max_length=10, choices=GENDER_CHOICES, verbose_name='性别') weight_kg = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='当前体重') avatar = models.ImageField(upload_to='avatars/', blank=True, verbose_name='头像') created_at = models.DateTimeField(auto_now_add=True, 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_delete=models.CASCADE, related_name='events') event_type = models.CharField(max_length=20, choices=EVENT_TYPES, verbose_name='事件类型') title = models.CharField(max_length=100, verbose_name='事件标题') event_date = models.DateField(verbose_name='发生日期') next_due_date = models.DateField(null=True, blank=True, verbose_name='下次日期') notes = models.TextField(blank=True, verbose_name='备注') created_at = models.DateTimeField(auto_now_add=True)

用一张通用事件表的好处是扩展性强,今后无论增加什么新类型,只要在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__lt=today) within_days = Q(next_due_date__gte=today, next_due_date__lte=today + timedelta(days=30)) upcoming_events = LifeEvent.objects.filter( Q(pet__is_active=True), expired | within_days, next_due_date__isnull=False, ).order_by('next_due_date')[:10]

至于体重趋势,我单独建了一张体重记录表,记录日期和体重数值:

class WeightRecord(models.Model): pet = models.ForeignKey(Pet, on_delete=models.CASCADE, related_name='weight_records') date = models.DateField() weight_kg = models.DecimalField(max_digits=5, decimal_places=2) created_at = models.DateTimeField(auto_now_add=True)

然后在宠物详情页让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='旺财', species='dog', birth_date=timezone.localdate() - timedelta(days=365), gender='male', weight_kg='8.50', ) def test_create_vaccine_event(self): event = LifeEvent.objects.create( pet=self.pet, event_type='vaccine', title='狂犬疫苗', event_date=timezone.localdate(), next_due_date=timezone.localdate() + timedelta(days=365), ) self.assertEqual(self.pet.events.count(), 1) self.assertEqual(event.next_due_date, timezone.localdate() + timedelta(days=365)) def test_upcoming_events_include_overdue(self): LifeEvent.objects.create( pet=self.pet, event_type='deworm', title='体内驱虫', event_date=timezone.localdate() - timedelta(days=60), next_due_date=timezone.localdate() - timedelta(days=30), ) today = timezone.localdate() upcoming = LifeEvent.objects.filter( next_due_date__lt=today ) | LifeEvent.objects.filter( next_due_date__gte=today, next_due_date__lte=today + timedelta(days=30), ) 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可以通过这份文档快速恢复状态,你自己也不会对着满屏代码怀疑人生。工具在迭代,但“先把问题想清楚再动手”这件事,永远值得多花时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询