首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-import-export分配当前用户

django-import-export分配当前用户
EN

Stack Overflow用户
提问于 2018-06-21 00:20:16
回答 2查看 893关注 0票数 1

正在尝试在创建实例时分配added_by用户,并希望创建另一个引用当前实例的模型实例

views.py

代码语言:javascript
复制
class ImportFarmersView(APIView):
    parser_classes = (MultiPartParser,)

    def post(self,request,org_slug=None,format=None,*args,**kwargs):
        serializer=TmpFileUploadSerializer(data=request.data)
        if not serializer.is_valid():
            return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST)
        entries=serializer.validated_data['file']

        profile_resource=ProfileResource()
        dataset=Dataset()
        imported_data = dataset.load(open(entries.temporary_file_path(),'rb').read(),'xls')
        result = profile_resource.import_data(dataset, dry_run=True)  # Test the data import

        if result.has_errors():
            return Response(status=status.HTTP_406_NOT_ACCEPTABLE)
        profile_resource.import_data(dataset, dry_run=False)  # Actually import now

        return Response(status=status.HTTP_202_ACCEPTED)

resources.py

代码语言:javascript
复制
class ProfileResource(resources.ModelResource):
    created_at=fields.Field(readonly=True)
    updated_at=fields.Field(readonly=True)
    class Meta:
        model=Profile
        skip_unchange=True
        report_skipped=False
        import_id_fields=('slug','email')

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2019-12-12 21:27:49

对于@Jagu提出的before_import_row答案,我使用了另一个解决方案。

我不想使用before_import_row解决方案的原因是它迫使我为资源创建一个字段属性。此外,在管理页面中的导入过程中,当导入程序显示:This importer will import the following fields: field1, field2, autofield1, autofield2时,我的用户可能会与导入程序所需的字段混淆。相反,我更喜欢这样说:This importer will import the following fields: field1, field2

让我们继续解决这个问题。

假设我有这样的模型:

代码语言:javascript
复制
class LotNumber(models.Model):
    lot_number = models.CharField(
        max_length=16,
        primary_key=True
    )
    is_active = models.BooleanField(
        default=True
    )
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        blank=True,
        editable=False,
        related_name='+',
        on_delete=models.SET_NULL
    )

我将把created_by属性指定为自动填充的字段。

下面是我的资源类的样子:

代码语言:javascript
复制
class LotNumberResource(resources.ModelResource):

    class Meta:
        model = LotNumber
        skip_unchanged = True
        report_skipped = False
        fields = (
            'lot_number',
            'is_active',
        )

    def after_import_instance(self, instance, new, **kwargs):
        instance.created_by = kwargs['user']

如您所见,在我的Meta块中,我只需要指定lot_numberis_active。然而,我选择覆盖的方法是after_import_instance。起初,我尝试使用before_import_row,但是修改行并不会自动填充created_by字段。在深入研究源代码之后,我注意到在before_import_row方法(请参阅源代码here)之后调用方法get_or_init_instance,该方法使用我定义的资源类(请参阅源代码here)获取模型实例。因此,如果资源类没有在fields属性中列出自动填充的字段,则实例永远不会获取该字段。

票数 3
EN

Stack Overflow用户

发布于 2019-05-31 21:25:35

您可以在resources.ModelResource的before_import_row钩子中访问当前的django用户。**kwarg中有一个'user‘。

所以在你的例子中,它看起来像这样

代码语言:javascript
复制
class ProfileResource(resources.ModelResource):
    ...
    def before_import_row(self, row, **kwargs):
        row['added_by'] = kwargs['user'].id

如果您在其中放置一个断点()并查看SimpleLazyObject,您将看到类似这样的内容(请注意,用户记录被包装在kwargs中):

代码语言:javascript
复制
-> row['added_by'] = kwargs['user'].id
(Pdb) kwargs
{'file_name': 'ImportDatasetWorking.csv', 'user': <SimpleLazyObject: <User: 
Kumar>>}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50952887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档