我创建了一个从AbstractUser派生的自定义用户、一个post_save信号和一个打印新用户id的接收器。
@receiver(post_save, sender=CustomUser, dispatch_uid='members.models.customuser.post_save')
def post_save_custom_user(sender, instance=None, created=False, **kwargs):
if not created:
return
print('post_save_custom_user: {}'.format(instance.id))当我通过管理界面创建一个新用户时,接收器被调用一次。当我使用django-import-export导入用户时,接收器被调用两次:一次是在导入文件的初始Submit之后,另一次是在Confirm Import之后。浏览我看到的代码,它在dry_run中创建用户,回滚事务并再次创建它。但是我如何在我的接收器中辨别这是否是一个预演呢?
我使用的是Python 3.6、Django 3.0.3、django-import-export 2.0.1
发布于 2020-05-20 06:00:55
看起来,django- import -export在导入确认时触发post_save,然后在导入之后再次触发。使用on_commit的建议对我不起作用,因此我不得不停止使用信号。不过,也有ModelResource.after_save_instace方法:
class MyResource(ModelResource):
class Meta:
model = MyModel
def after_save_instance(
self, instance: MyModel, using_transactions: bool, dry_run: bool,
):
super().after_save_instance(instance, using_transactions, dry_run)
if dry_run is False:
my_model_on_save_action(instance)发布于 2020-07-08 00:16:10
谢谢你这么做。有人知道为什么Django- import -export在confirm using dry_run = True的导入过程中为一个模型调用了两次save()方法吗?据我所知,导入数据只是临时保存到内存或磁盘中的临时位置,而不是实际写入数据库。
为了让我的解决方案工作,我需要使用上面的解决方案,在模型资源上使用after_save_instance,但是...对于使用CreateView的单实例添加,我需要调整我的form_valid方法,以便在创建模型的新实例时执行操作:
class MyCreateView(CreateView):
model = MyModel
fields = [ 'email', 'name']
def form_valid(self, form):
self.object = form.save()
self.object.save()
## Perform action here like send email etc.
return HttpResponseRedirect(self.get_success_url()) https://stackoverflow.com/questions/60124600
复制相似问题