Наполнение базы данных 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"
}
},
....
]