やりたいこと
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 book
や Can 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
で関連付けが実施されるため問題なかった。