[英]How to add permissions in Django post_save signal?
I have a problem to add permissions in Django post_save signal because the m2m relationships don't persist.我在 Django post_save 信号中添加权限时遇到问题,因为 m2m 关系不会持续存在。 They are correctly displayed with user_permissions.all()
after assignment, but as soon as I save the model again the queryset get empty.它们在分配后使用user_permissions.all()
正确显示,但是一旦我再次保存模型,查询集就会变空。 What am'I doing wrong?我究竟做错了什么?
I don't have the same problem if I assign permissions at the object level with guardian
.如果我使用guardian
在对象级别分配权限,我不会遇到同样的问题。
models.py模型.py
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(db_index=True, max_length=255, unique=True, null=True, blank=True)
last_name = models.CharField(max_length=255, null=True, blank=True)
first_name = models.CharField(max_length=255, null=True, blank=True)
email = models.EmailField(db_index=True, unique=True)
def save(self, *args, **kwargs):
return super(User, self).save(*args, **kwargs)
class Manager(User):
...
def save(self, *args, **kwargs):
return super(Manager, self).save(*args, **kwargs)
signals.py信号.py
@receiver(post_save, sender=Manager)
def assign_manager_permissions(sender, instance, created, raw, using, **kwargs):
content_type = ContentType.objects.get_for_model(Manager)
print('Current permissions:')
for p in instance.user_permissions.all():
print(p)
for codename in ['view_manager',
'change_manager',
'add_manager',
'delete_manager']:
permission = Permission.objects.get(content_type=content_type, codename=codename)
instance.user_permissions.add(permission)
instance.refresh_from_db()
print('After refresh permissions:')
for p in instance.user_permissions.all():
print(p)
When I save the model the result is always the same:当我保存模型时,结果总是一样的:
django-1 | Current permissions:
django-1 |
django-1 | After refresh permissions:
django-1 | user | manager | Can add manager
django-1 | user | manager | Can change manager
django-1 | user | manager | Can delete manager
django-1 | user | manager | Can view manager
I found the answer to my own question by using transaction.commit
, as proposed here .我通过使用transaction.commit
找到了我自己的问题的答案,如这里所建议的那样。
from django.db import transaction
def on_transaction_commit(func):
def inner(*args, **kwargs):
transaction.on_commit(lambda: func(*args, **kwargs))
return inner
@receiver(post_save, sender=Manager)
@on_transaction_commit
def assign_manager_permissions(sender, instance, created, raw, using, **kwargs):
# code here
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.