我开始学习 Django 和 Python 来迁移我的网站,并且我正在尝试设置和填充 SQLite 数据库。我看到的所有教程都向您展示了如何使用管理应用程序并使用 Web UI 手动添加帖子,但我希望 Django 在我的文件夹结构中找到 Markdown 文件,并从这些 Markdown 文件中提取信息并填充数据库有了这些数据。
这个主题(使用Python从.txt文件填充SQLite3数据库)似乎符合我的方向,但是1)它很旧,2)它涉及一个CSV文件。 (这是否需要采用 CSV 格式?JSON 的效果会一样好还是更好,特别是因为我在网站上有一个 JSON 提要并且最终需要填充 JSON 文件?)否则,我找到了有关导入文件的主题从文件夹填充数据库,但这些技巧通常适用于 Python,我不确定 Django 是否有特定的工具可以同样好或更好地完成此类事情。
设置 Django 从 Markdown 文件填充 SQLite 数据库的好方法是什么?我需要的所有代码是否都在 models.py 文件中,或者我是否需要在项目和/或应用程序中的其他位置使用单独的 Python 脚本和/或文本文件来运行?
现在我的文章位于类似
articles/YYYY/MM/article-name.md
的文件夹结构中。我目前正在使用 Eleventy(它对我来说已经失败了,这就是我要迁移的原因),因此 Markdown 文件在每个文件的顶部都有 YAML,用于我的标题、日期、标签等内容我需要弄清楚如何让 Django 读取这些数据并用这些数据填充数据库,最终在配置完成后编写 Jinja2 代码。这些帖子通常也有图像和视频文件,所以我需要将所有这些作为 BLOB 数据插入吗?
最后一段我可能有点操之过急,我很好,只是开始一个简单的“Hello World”示例,并从那里开始工作并取得进展。
假设这是您的 Markdown 文件。
---
title: "My First Article"
date: 2024-09-07
tags: ["django", "python", "markdown"]
image: "first_article.jpg"
---
# This is the content of my first article.
Hello, world!
首先,您需要为文章创建一个模型。 (确保为 ImageField 安装 Pillow-
pip install Pillow
)
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=255)
date = models.DateField()
tags = models.CharField(max_length=255)
content = models.TextField()
slug = models.SlugField(unique=True)
image = models.ImageField(upload_to='images/', null=True, blank=True)
def __str__(self):
return self.title
其次,你需要
PyYAML
来阅读 YAML 的前文,以及 markdown
来转换 Markdown 内容 - pip install PyYAML markdown
这是我从 Markdown 文件到 SQLite 数据库的演示代码。
def import_markdown_file(self, file_path):
with open(file_path, 'r') as f: # file_path is a path to your Markdown file.
content = f.read()
# Separate YAML front matter and Markdown content
front_matter, markdown_content = content.split('---\n', 1)[1].split('---\n', 1)
# Parse the YAML front matter
metadata = yaml.safe_load(front_matter)
# Convert Markdown content to HTML (optional)
html_content = markdown.markdown(markdown_content)
# Create a new Article object
article = Article(
title=metadata.get('title', 'Untitled'),
date = metadata.get('date', '2024-01-01'),
tags=','.join(metadata.get('tags', [])),
content=html_content if html_content else 'Default content',
slug=os.path.splitext(os.path.basename(file_path))[0],
)
# Handle the image
if 'image' in metadata and metadata['image']:
image_path = os.path.join(os.path.dirname(file_path), metadata['image'])
if os.path.exists(image_path):
with open(image_path, 'rb') as img_file:
# Save image to the ImageField in the Article model
article.image.save(os.path.basename(image_path), File(img_file), save=False)
# Save the article object to the database
article.save()
仅供参考,图像将上传到项目中的媒体目录(/media/images)。 将这些行添加到您的
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
我希望这能解决您的问题。如果您需要任何进一步的帮助,请在评论中告诉我。
您可以使用 Markdown 创建一个固定 JSON 文件,可以使用
python manage.py loaddata <your_fixture_file_path>
命令轻松将其加载到数据库中。
文档:- https://docs.djangoproject.com/en/5.1/topics/db/fixtures/
JSON 夹具的格式:-
[
{
"model": "appname.ModelName",
"pk": 1,
"fields": {
"field1": "Value1",
"field2": "Value2"
}
},
....
]