django导入导出分配当前用户

django导入导出分配当前用户,django,django-rest-framework,django-import-export,Django,Django Rest Framework,Django Import Export,试图在创建实例时按用户分配添加的_,并希望创建另一个引用当前实例的模型实例 views.py class ImportFarmersView(APIView): parser_classes = (MultiPartParser,) def post(self,request,org_slug=None,format=None,*args,**kwargs): serializer=TmpFileUploadSerializer(data=request.dat

试图在创建实例时按用户分配添加的_,并希望创建另一个引用当前实例的模型实例

views.py

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)
资源.py

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')

提前感谢

您可以在resources.ModelResource上的before\u import\u行钩子中访问当前django用户。在**kwarg中有一个“用户”

所以在你的情况下,它看起来像

class ProfileResource(resources.ModelResource):
    ...
    def before_import_row(self, row, **kwargs):
        row['added_by'] = kwargs['user'].id
如果在其中放置断点()并查看kwargs,您将看到类似的内容(请注意,用户记录包装在SimpleLazyObject中):

->row['added_by']=kwargs['user'].id
(Pdb)kwargs
{'file_name':'ImportDatasetWorking.csv','user':}

我在导入前使用了@Jagu提出的
答案的替代解决方案

我不想在导入行之前使用
解决方案的原因是它迫使我为资源创建字段属性。此外,在管理页面的导入过程中,我的用户可能会与导入程序所需的字段混淆,因为它会说:
此导入程序将导入以下字段:field1、field2、autofield1、autofield2
。相反,我更希望它说:
此导入程序将导入以下字段:field1、field2

让我们继续解决这个问题

假设我有这个模型:

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
    )
我将指定由
属性创建的
作为自动填充字段

下面是我的资源类的外观:

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
块中,我只需指定
批号
是否处于活动状态
。然而,我选择的覆盖方法是在导入实例之后的
。起初,我试图在导入行之前使用
,但修改行并没有自动填充
创建人字段。在深入研究源代码之后,我注意到方法
get\u或\u init\u instance
before\u import\u row
方法之后被调用(参见源代码),该方法使用我定义的资源类(参见源代码)获取模型实例。因此,如果资源类没有在
字段属性中列出自动填充的字段,那么实例将永远不会获取该字段。

不知道如何使用get\u resource\u kwargs来允许将请求传递给资源,如果这样可以解决问题的话。谢谢你提供的额外细节。普罗斯特!非常感谢。不过,在查看了源代码链接之后,代码似乎在我的回答之后已经更新,因此我将修改到调用函数的特定行的链接。
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']