在 Django 中从 Markdown 文件填充 SQLite 数据库

问题描述 投票:0回答:2

我开始学习 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”示例,并从那里开始工作并取得进展。

python django sqlite markdown
2个回答
0
投票

假设这是您的 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')

我希望这能解决您的问题。如果您需要任何进一步的帮助,请在评论中告诉我。


0
投票

您可以使用 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"
        }
    },
    ....
]
© www.soinside.com 2019 - 2024. All rights reserved.