[Django] CSVをモデルにインポートする方法

サーバーに保存してあるCSVファイルのデータを読み込み、Djangoでモデルに登録してみます。

モデルの作成

from django.db import models

class Book(models.Model):
    book_code = models.CharField(max_length=255, unique=True)  # 本のコード、ユニークな値
    name = models.CharField(max_length=255)  # 

    def __str__(self):
        return self.name

実験用にbook_codeとnameのカラムを持つ簡単なモデルを作成します。

viewの作成

import csv
from django.shortcuts import render
from .models import Book

def import_books_and_display(request):
    # CSVファイルのパス(任意)
    csv_file_path = 'path/to/your/books.csv'
    
    # CSVからデータを読み込み、Bookモデルにデータをインポート
    with open(csv_file_path, newline='', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        next(reader)  # ヘッダー行をスキップ
        books_imported = []
        for row in reader:
            book, created = Book.objects.get_or_create(
                book_code=row[0],
                name=row[1]
            )
            if created:
                books_imported.append(book)
    
    # books変数に全Bookオブジェクトを代入
    books = Book.objects.all()
    
    # テンプレートと表示データの設定
    return render(request, 'books/display_books.html', {'books': books, 'books_imported': books_imported})

まず、CSVファイルのパスを設定します。

CSVの操作には Pythonの「CSV」モジュールを使います。

CSVの一行目がタイトルである場合、二行目からがデータになります。よって一行目はインポートから除外します。これは下記のように記載すればOKです。

「next(reader)」

template

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Imported Books</title>
</head>
<body>
    <h1>Imported Books</h1>
    <h2>Newly Imported</h2>
    <ul>
        {% for book in books_imported %}
            <li>{{ book.book_code }} - {{ book.name }}</li>
        {% empty %}
            <li>No new books were imported.</li>
        {% endfor %}
    </ul>
    <h2>All Books</h2>
    <ul>
        {% for book in books %}
            <li>{{ book.book_code }} - {{ book.name }}</li>
        {% endfor %}
    </ul>
</body>
</html>


Author: webmaster