django-import-export M2M, FK
GroupWidget
どちらでも使える:
- Users.groups
- Permission.group_set
from import_export import widgets, fields
class GroupWidget(widgets.ManyToManyWidget):
def clean(self, value, row=None, *args, **kwargs):
if not value:
return self.model.objects.none()
if self.field == "name":
# 存在しない場合作成する
ids = value.split(self.separator)
ids = filter(None, [i.strip() for i in ids])
return map(lambda i: self.model.objects.get_or_create(name=i)[0], ids)
return super().clean(self, value, row=row, *args, **kwargs)
ContentTypeWidget
- Permission.content_type など ForeingKey 定義されていると使える
- データは
{app_label}.{model}でレンダリングされるので、取り込む時にsplit('.')する
from import_export import fields, widgets
from django.contrib.contenttypes.models import ContentType
class ContentTypeWidget(widgets.ForeignKeyWidget):
def clean(self, value, row=None, *args, **kwargs):
if value is None:
return None
app_label, model = value.split(".")
content_type = ContentType.objects.get_by_natural_key(app_label, model)
return content_type
def render(self, value, obj=None):
return f"{value.app_label}.{value.model}"
User.groups
User の Resource を定義するにあたって、groups を name で import/export するには、以下のように記述することができます。
from django.contrib.auth.models import User, Group
from import_export import resources, widgets, fields
class UserResource(resources.ModelResource):
groups = fields.Field(
column_name='groups',
attribute='groups',
# widget=widgets.ManyToManyWidget(Group, field='name')
widget=GroupWidget(Group, field='name') # 存在しないグループは作成するWidget
)
class Meta:
model = User
import_id_fields = ("usernmae", )
fields = ('username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'date_joined')
この例では、ManyToManyWidgetを使用して、グループ名を取得しています。これは、django-import-exportの標準の方法です。
ソース: Bing との会話 2023/6/9
- (1) 入門 — django-import-export 0.5.1 ドキュメント - GitHub Pages. https://kurozumi.github.io/django-import-export/getting_started.html.
- (2) django-import-export to export User model - Stack Overflow. https://stackoverflow.com/questions/28886074/django-import-export-to-export-user-model.
- (3) python - django-import-export の CSV インポートエラーがどこで … https://ja.stackoverflow.com/questions/86152/django-import-export%e3%81%aecsv%e3%82%a4%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%88%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e3%81%a9%e3%81%93%e3%81%a7%e7%99%ba%e7%94%9f%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e3%81%ae%e3%81%8b%e7%9f%a5%e3%82%8a%e3%81%9f%e3%81%84.
Permission.group_set
from django.contrib.auth.models import Group, Permission
from import_export import fields, resources, widgets
from django.contrib.contenttypes.models import ContentType
from .. import models
class PermissionResource(resources.ModelResource):
group_set = fields.Field(
column_name="group_set",
attribute="group_set",
widget=GroupWidget(Group, field="name"),
)
content_type = fields.Field(
column_name="content_type",
attribute="content_type",
widget=ContentTypeWidget(ContentType, "app_label"),
)
class Meta:
model = Permission
import_id_fields = ["content_type", "codename"]
fields = [
"content_type",
"codename",
"name",
]