2017-01-31 3 views
1

csvファイルからアプリケーションのユーザを一括生成する必要があります。私は「脱水」メソッドで使用することを期待していた機能を持っているユーザ名を生成するにはDjangoインポートエクスポートはユーザcsvアップロードの前にユーザ名を生成します

LAST_NAME、FIRST_NAME、電子メール

:私はcsvファイルは、次のフィールドが含まれています。脱水方法は、輸入でのみ機能し、輸入では機能しません。

[編集] @ 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) 
+0

あなたはすべてのエラーを取得している、明確にしてください? – Sourabh

+0

エラーはありません。インポートしようとすると、脱水方法は無視されます。しかし、エクスポートでうまく動作します。それは輸入に取り組むことになっていますか? – jcuot

+0

'pre_save'または' post_save' djangoシグナルを使ってこれを行うことができます。 – Bitonator

答えて

3

私はソースでチェックして、私は輸入と輸出の間に別の方法を発見した...の機能export_fieldの属性はですが、import_fieldの属性はありません。

エクスポート:https://github.com/django-import-export/django-import-export/blob/master/import_export/resources.py#L590-L595

def export_field(self, field, obj): 
    field_name = self.get_field_name(field) 
    method = getattr(self, 'dehydrate_%s' % field_name, None) 
    if method is not None: 
     return method(obj) 
    return field.export(obj) 

インポート:https://github.com/django-import-export/django-import-export/blob/master/import_export/resources.py#L315-L321

def import_field(self, field, obj, data): 
    """ 
    Calls :meth:`import_export.fields.Field.save` if ``Field.attribute`` 
    and ``Field.column_name`` are found in ``data``. 
    """ 
    if field.attribute and field.column_name in data: 
     field.save(obj, data) 

私はあなたがあなたのケースのためにimport_objの機能、例を上書きする必要があると思う:

ここ
from import_export import resources, widgets 
from import_export.admin import ImportExportModelAdmin 

# your package imported 

class UserResource(resources.ModelResource): 

    class Meta: 
     model = User 
     .... 

    def dehydrate_username(self, user): 
     # your unfinish code got here, 
     # if you want to enable for export mode... 
     # username = generate_username_function here 
     return username 

    def import_obj(self, obj, data, dry_run): 
     """ 
     Traverses every field in this Resource and calls 
     :meth:`~import_export.resources.Resource.import_field`. 
     """ 
     for field in self.get_fields(): 
      if isinstance(field.widget, widgets.ManyToManyWidget): 
       continue 

      # find specific `field_name` 
      # param of `data` is OrderDict 
      if field.column_name == 'username': 
       data.update({'username': 'Hello %s' % data.get('username')}) 
      # checkout the changed object 
      print(obj) 

      self.import_field(field, obj, data) 

私のテストです...

test import export

も参照してください。この似問題。 https://github.com/django-import-export/django-import-export/issues/51

は、それが参考に願っています。..

+0

完璧に動作します!ありがとうございました! – jcuot

+0

@jcuotあなたの歓迎.. :) –

関連する問題