django-import-exportでインポート、エクスポートの権限を付与する

やりたいこと

Djangoでインポート、エクスポートを実行できるようにする https://github.com/django-import-export/django-import-export において、特定ユーザーにのみ、インポートエクスポート機能を公開したい。

例として今回エクスポートしたいモデルは以下

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)

対象のバージョンは Django 4.2.13, django-import-exportは 4.0.3 になります。

やったこと

django.contrib.auth がもつパーミッション機能と組み合わせることで実現します。

1. IMPORT_EXPORT_IMPORT_PERMISSION_CODE, IMPORT_EXPORT_IMPORT_PERMISSION_CODE を settings.py にセットする

IMPORT_EXPORT_IMPORT_PERMISSION_CODE = "import"
IMPORT_EXPORT_EXPORT_PERMISSION_CODE = "export" 

2. 対象モデルのメタクラスpermissionsを付与する。その場合、「1で付与した文字列_モデル名」とする

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)
+
+    class Meta:
+       permissions = (('import_book', 'Can import book'), ('export_book', 'Can export book'))

3. python manage.py makemigrations 対象モデルのあるアプリ を実行してマイグレーションファイルを作成

4. python manage.py migrate

5. その後 Can import bookCan export book の権限を対象ユーザに付与する

以上です。

ハマったこと

対象となるモデル名が別アプリで使用しているモデル名と同名だったため、permissionsのラベル名を アプリ名_モデル名 としてしまい動作しなかった。

結論は IMPORT_EXPORT_IMPORT_PERMISSION_CODE(もしくは IMPORT_EXPORT_EXPORT_PERMISSION_CODE)_モデル名 で良い。

該当のソースコードこちら。ここから参照される django.contrib.auth.get_permission_codename のコードはこちら(Django 4.2現在)

この場合、別アプリの同名モデルはどうなるんだろう?と思ったが、データベース上では django_content_type.id で関連付けが実施されるため問題なかった。

参考リンク