feat: 创建 LobsterDiary 模型,支持数据库存储日记

- 创建 LobsterDiary 模型
  * 关联龙虾(ForeignKey)
  * 日期、标题、内容
  * 分类(成才之路/工作记忆/技术笔记)
  * 标签(JSONField)
  * Embedding 字段(预留 RAG 支持)
  * 数据库索引优化

- 数据库迁移
  * 添加 LobsterDiary 表
  * 添加索引:lobster+date, category+date, date

- 导入脚本
  * 创建 import_diaries 管理命令
  * 导入飞行侠的成才之路日记(3 篇)

- 更新 API
  * /api/lobsters/<id>/diary/dates/ - 从数据库查询
  * /api/lobsters/<id>/diary/<date>/ - 从数据库读取

- PostgreSQL 配置模板
  * settings_postgresql.py
  * 准备好 PostgreSQL 迁移

技术栈:SQLite(当前) → PostgreSQL(未来)
RAG 支持:预留 embedding 字段,未来可扩展

🗄️ 日记正式进入数据库时代!
This commit is contained in:
2026-04-03 17:38:18 +08:00
parent 689851e762
commit 24e4ca2c82
7 changed files with 330 additions and 28 deletions

View File

@@ -0,0 +1,109 @@
# Generated by Django 4.2 on 2026-04-03 09:37
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("lobsters", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="lobster",
name="workspace",
field=models.CharField(
blank=True, default="", max_length=100, verbose_name="工作区"
),
),
migrations.CreateModel(
name="LobsterDiary",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("date", models.DateField(verbose_name="日期")),
("title", models.CharField(max_length=200, verbose_name="标题")),
("content", models.TextField(verbose_name="内容")),
(
"category",
models.CharField(
choices=[
("chengcai", "成才之路"),
("memory", "工作记忆"),
("tech", "技术笔记"),
("other", "其他"),
],
default="other",
max_length=50,
verbose_name="分类",
),
),
(
"tags",
models.JSONField(blank=True, default=list, verbose_name="标签"),
),
(
"embedding",
models.TextField(
blank=True, null=True, verbose_name="文本向量 (JSON 格式)"
),
),
(
"embedding_model",
models.CharField(
blank=True,
default="",
max_length=50,
verbose_name="Embedding 模型版本",
),
),
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
),
(
"updated_at",
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
),
(
"lobster",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="diaries",
to="lobsters.lobster",
verbose_name="龙虾",
),
),
],
options={
"verbose_name": "龙虾日记",
"verbose_name_plural": "龙虾日记",
"ordering": ["-date", "-created_at"],
},
),
migrations.AddIndex(
model_name="lobsterdiary",
index=models.Index(
fields=["lobster", "date"], name="lobsters_lo_lobster_5895f8_idx"
),
),
migrations.AddIndex(
model_name="lobsterdiary",
index=models.Index(
fields=["category", "date"], name="lobsters_lo_categor_177677_idx"
),
),
migrations.AddIndex(
model_name="lobsterdiary",
index=models.Index(fields=["date"], name="lobsters_lo_date_d11f64_idx"),
),
]