【发布时间】:2017-01-31 16:31:17
【问题描述】:
我需要从 csv 文件为我的应用批量生成用户。我拥有的 csv 包含以下字段:
姓、名、电子邮件
为了生成用户名,我有一个希望在“脱水”方法中使用的函数。 dehydrate 方法仅适用于出口,不适用于进口。
[编辑] 在@sanca-kembang 在下面给出答案之后,这就是我最终要做的。下面的示例完美运行(django 1.10.5,python 3.6.0)。
tools.py
from django.contrib.auth.models import User
def generate_username(first_name, last_name):
fname = first_name.lower()
lname = last_name.lower()
prefix = "%s%s" % (fname[0], lname)
username = prefix
i = 2
while User.objects.filter(username = username).exists():
username = "%s%d" % (prefix, i)
i += 1
return username
admin.py
from django.contrib.auth.models import User
from import_export import resources, widgets
from import_export.admin import ImportExportModelAdmin
from .tools import generate_username
class UserResource(resources.ModelResource):
class Meta:
model = User
skip_unchanged = True
report_skipped = True
fields = ('id', 'last_name', 'first_name', 'email', 'username')
def import_obj(self, obj, data, dry_run):
first_name = data.get('first_name')
last_name = data.get('last_name')
username = generate_username(first_name, last_name)
for field in self.get_fields():
if isinstance(field.widget, widgets.ManyToManyWidget):
continue
if field.column_name == 'username':
data.update({'username': username})
print(obj)
self.import_field(field, obj, data)
class UserAdmin(ImportExportModelAdmin):
resource_class = UserResource
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
【问题讨论】:
-
您是否遇到任何错误,请澄清一下?
-
没有错误,尝试导入时直接忽略了脱水方法。不过,在导出时效果很好。它应该适用于导入吗?
-
您可以使用
pre_save或post_savedjango 信号来执行此操作。 -
@Bitonator 你能举一个 pre_save 的简短例子吗?我查看了 django 导入导出站点的文档,对此非常节俭。
标签: django csv django-import-export