django admin画面に簡単にファイルの入力・出力を追加する


django admin画面はmodelのデータ管理に非常に便利な機能です。
csvなどのファイルでのデータの追加、出力ができるとさらに便利です。
django-import-exportプラグインを導入することでこの機能を簡単に導入することができます。

django-import-exportプラグインを追加する

pip install django-import-export

modelを準備する

以下のようなmodelを準備します。
商品マスタ product
作家マスタ author
出版社マスタ publisher
class Product(models.Model):
    product_id = models.BigAutoField(
        primary_key=True,
        verbose_name='商品マスタID'
    )
    product_name = models.TextField(
        verbose_name='商品名'
    )
    product_price = models.IntegerField(
        verbose_name='商品価格',
    )
    author = models.ForeignKey(
      Author,
      on_delete=models.DO_NOTHING
    )
    publisher = models.ForeignKey(
      Publisher,
      on_delete=models.DO_NOTHING
    )

    class Meta:
      managed = False
      db_table = 'product'
      verbose_name = '商品マスタ'
      verbose_name_plural = '商品マスタ'

      def __str__(self):
          return self.product_name

class Publisher(models.Model):
    publisher_id = models.BigAutoField(
        primary_key=True,
        verbose_name='出版社マスタID'
    )
    publisher_name = models.TextField(
        verbose_name='出版社名'
    )

    class Meta:
      managed = False
      db_table = 'publisher'
      verbose_name = '出版社マスタ'
      verbose_name_plural = '出版社マスタ'

      def __str__(self):
          return self.publisher_name

class Author(models.Model):
    author_id = models.BigAutoField(
        primary_key=True,
        verbose_name='作家マスタID'
    )
    author_name = models.TextField(
        verbose_name='作家名'
    )

    class Meta:
      managed = False
      db_table = 'author'
      verbose_name = '作家マスタ'
      verbose_name_plural = '作家マスタ'

      def __str__(self):
          return self.author_name

商品マスタを管理画面で呼び出せるようにadmin.pyに以下のように記述します

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = (
        'product_id',
        'product_name',
        'product_price',
        'author',
        'publisher',
    )
    list_display_links = (
        'product_name',
    )
    list_filter = (
        'author',
        'publisher',
    )
    search_fields = (
        'product_name',
    )
    ordering = (
        'product_id',
    )
これで商品マスタ product が表示できるようになりました。

ファイルのインポート・エクスポート機能を追加する

admin.pyにプラグインの読み込みを記述します
from manga_server_django.admin.import_export import CommonImportExportSetting
ファイルのインポート・エクスポート機能を追加するためにadmin.pyにresourcesを追加します。
出力するmodelの項目名を指定します。
項目名の日本語名への変換や、取り込み時に外部キーで対応する項目名の指定などもできます。
class ProductResource(resources.ModelResource):
    # modelの項目名を指定。フィールド名・日本語表記の変換などもここで行う
    product_id = Field(
        attribute='product_id',
        column_name='商品マスタID'
    )
    product_name = Field(
        attribute='product_name',
        column_name='商品名'
    )
    product_price = Field(
        attribute='product_price',
        column_name='商品価格'
    )
    # 外部キーのフィールドの場合はForeignKeyWidgetを記述する
    publisher_name = Field(
        attribute='publisher_name',
        column_name='出版社名'
        widget=ForeignKeyWidget(Publisher, 'publisher_name'),
    )
    author_name = Field(
        attribute='author_name',
        column_name='作者名'
        widget=ForeignKeyWidget(Author, 'author_name'),
    )

    class Meta:
      model = Product
      # 出力設定
      # ヘッダーに出力する文字列
      headers = (
        '商品マスタID',
        '商品名',
        '商品価格',
        '出版社名',
        '作者名',
      )
      # 出力するフィールド指定
      fields = (
        'product_id',
        'product_name',
        'product_price',
        'publisher_name',
        'author_name',
      )
      # 出力するフィールドの順番指定
      export_order = (
        'product_id',
        'product_name',
        'product_price',
        'publisher_name',
        'author_name',
      )
      # 入力設定
      # 入力の主キーとなる項目の指定
      import_id_fields = ('product_id',)
      # 入力するフィールドの指定
      import_order = (
        'product_id',
        'product_name',
        'product_price',
        'publisher_name',
        'author_name',
      )
      # 更新のない行はスキップする
      skip_unchanged = True
      # 結果表示はスキップしない
      report_skipped = False
ProductAdminにImportExportMixinを追加。
resource_classに先ほど作成したProductResourceを指定します。
@admin.register(Product)
class ProductAdmin(ImportExportMixin, admin.ModelAdmin):

    # 省略

    resource_class = ProductResource
    # 入力・出力するフォーマット。下記ではcsvとExcelファイルにしています。他にもtsv、YAML、XMLなども指定できます。
    formats = [
        base_formats.CSV,
        base_formats.XLS,
        base_formats.XLSX,
    ]
    # 出力する文字コード指定
    to_encoding = 'CP932'
    # 入力する文字コード指定
    from_encoding = 'CP932'
これで管理画面から商品マスタのインポート・エクスポートができるようになりました。

admin画面 上部の表示
エクスポート画面
インポート画面

ちょっとしたプラグインの追加でdjango admin画面で大量のデータをより使いやすくできるので非常に便利です。
現在未評価

コメント

コメントを投稿
コメントするには TORICO-ID にログインしてください。
ログイン コメント利用規約