gpt4 book ai didi

django-import-export 分配当前用户

转载 作者:行者123 更新时间:2023-12-02 20:22:42 25 4
gpt4 key购买 nike

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

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

提前致谢

最佳答案

我对 @Jagu 提出的 before_import_row 答案使用了替代解决方案。

我不想使用before_import_row解决方案的原因是它迫使我为资源创建一个字段属性。此外,在管理页面的导入过程中,我的用户可能会对导入器所需的字段感到困惑,因为它显示:此导入器将导入以下字段: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
)

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

现在我的资源类如下所示:

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 block 中,我只需指定 lot_numberis_active。但是,我选择重写的方法是 after_import_instance。起初,我尝试使用 before_import_row 但修改行并没有自动填充 created_by 字段。深入研究源代码后,我注意到方法 get_or_init_instancebefore_import_row 方法之后调用(参见源代码 here ),该方法使用我的方法获取模型实例定义的资源类(参见源代码here)。因此,如果资源类未在 fields 属性中列出自动填充字段,则实例将永远不会获取该字段。

关于django-import-export 分配当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50952887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com