Наполнение базы данных SQLite из файлов Markdown в Django

Я начинаю изучать Django и Python, чтобы перенести свой сайт, и пытаюсь разобраться с настройкой и заполнением базы данных SQLite. Все учебники, которые я вижу, показывают, как это сделать с помощью приложения администратора и веб-интерфейса для добавления постов вручную, но я хочу, чтобы Django находил файлы Markdown в структуре папок, извлекал информацию из этих файлов Markdown и заполнял базу данных этими данными.

Эта тема (Populating a SQLite3 database from a .txt file with Python), кажется, находится в том направлении, куда я направляюсь, но 1) она старая, и 2) в ней используется CSV-файл. (Обязательно ли это делать в CSV? Может ли JSON работать так же хорошо или лучше, тем более что у меня есть JSON-лента на сайте и в конечном итоге мне нужно будет заполнить JSON-файл в любом случае?) В противном случае, я нашел темы об импорте файлов из папок для заполнения базы данных, но эти советы относятся к Python в целом, и я не был уверен, есть ли в Django специальные инструменты для выполнения подобных вещей так же хорошо или лучше.

Каким образом можно настроить Django на заполнение базы данных SQLite из файлов Markdown? Весь код, который мне понадобится для этого, находится в файле 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!

Сначала нужно создать модель для статей. (Обязательно установите Pillow для ImageField-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

Это мой демонстрационный код для работы с базой данных SQLite из файла Markdown.

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 (/media/images) в вашем проекте. Добавьте эти строки в ваш settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Надеюсь, это решит вашу проблему. Дайте мне знать в комментариях, если вам понадобится дополнительная помощь.

Вы можете создать JSON-файл приспособления, используя разметку, который можно легко загрузить в вашу базу данных с помощью команды python manage.py loaddata <your_fixture_file_path>.

Docs:- https://docs.djangoproject.com/en/5.1/topics/db/fixtures/

Формат JSON-фиксации:-

[
   {
        "model": "appname.ModelName",
        "pk": 1,
        "fields": {
            "field1": "Value1",
            "field2": "Value2"
        }
    },
    ....
]
Вернуться на верх