Django-import-export - 如何将用户信息传递给ForeignKeyWidget?

我需要以某种方式将用户信息ForeignKeyWidget从资源类传递到类,我在其中创建foreignKey对象:


class CompanyWidget(ForeignKeyWidget):


    def clean(self, value, row=None, *args, **kwargs):

        print(self.user, file=sys.stderr)

        if not value:

            return None

        else:

            obj, _ = Company.objects.get_or_create(

                name=value,

                created_by='I NEED USER INFORMATION HERE SOMEHOW',


            )

        return obj

做这个的最好方式是什么?


我尝试自己解决这个问题,并且非常接近,但无法解决最后一块难题。您覆盖__init__ 资源中的类并在那里获取用户信息。然后,我不知道如何将这些self.user信息传递到类变量中company。


这是代码:


class ContactResource(resources.ModelResource):

    def __init__(self, *args, **kwargs):

        self.user = kwargs.pop('user', None)

        super(ContactResource, self).__init__(*args, **kwargs)


    company = fields.Field(

        column_name='company',

        attribute='company',

        widget=CompanyWidget(model=Company, field='name', user='I NEED TO PASS USER HERE FROM __INIT__'))


    def after_import_instance(self, instance, new, **kwargs):

        instance.created_by = kwargs['user']

如果我以某种方式设法将用户信息传递到变量中**kwargs,company那么我可以通过覆盖ForeignKeyWidget的__init__类来在下游使用它:


class CompanyWidget(ForeignKeyWidget):

    def __init__(self, model, field='pk', *args, **kwargs):

        self.model = model

        self.field = field

        self.user = kwargs.pop('user', None)

        super(CompanyWidget, self).__init__(model, *args, **kwargs)


    def clean(self, value, row=None, *args, **kwargs):

        print(self.user, file=sys.stderr)

        if not value:

            return None

        else:

            obj, _ = Company.objects.get_or_create(

                name=value,

                created_by=self.user,


            )

        return obj

任何帮助将不胜感激,我花了很长时间才到达这里,我觉得我真的很接近。先感谢您。


守着星空守着你
浏览 138回答 1
1回答

牧羊人nacy

事实证明,完全不使用ForeignKeyWidget 来实现这一点更容易。如果您有多个不唯一但具有相同名称的外键(在我的例子中,由不同用户创建相同的公司名称),则可以通过以下方式解决问题:类 ContactResource(resources.ModelResource):def __init__(self, *args, **kwargs):    self.user = kwargs.pop('user', None)    super(ContactResource, self).__init__(*args, **kwargs)company = fields.Field(column_name='company')class Meta:    model = Contact    skip_unchanged = True    report_skipped = True    exclude =('is_active', 'created_by')    export_order = ('id','first_name','last_name','email','phone','address','description','company','created_on','website','job_title','birthday')def after_import_instance(self, instance, new, **kwargs):    instance.created_by = self.user # kwargs['user']def import_field(self, field, obj, data):    field_name = self.get_field_name(field)    method = getattr(self, 'clean_%s' % field_name, None)    if method is not None:        obj = method(field, obj, data)    super(ContactResource, self).import_field(field, obj, data)def clean_company(self, field, obj, data):    name = data[field.column_name]    company, created = Company.objects.get_or_create(name=name, created_by=self.user)    obj.company = company    return obj
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python