如何解决Django m2m_changed信号,post_remove后自动调用post_add
当用户从 Tank 的 users 字段中删除时,我想从 Tank 的管理员中删除用户。
但是当我调用 instance.moderators.remove(*pk_set)
时,它被删除,然后通过 post_add 信号再次添加。
以这种方式工作users.pre_remove > users.post_remove > moderators.pre_remove > moderators.post_remove > moderators.pre_add > moderators.post_add
最后两个(pre_add、post_add)被不必要地调用
我正在使用 Django 管理页面进行这些操作。
型号:
class Tank(models.Model):
device = models.OneToOneField(Device,on_delete=models.SET_DEFAULT,related_name="tank",default=1)
users = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name="tanks",blank=True)
hidden_for_users = models.ManyToManyField(
settings.AUTH_USER_MODEL,related_name="hidden_tanks",blank=True)
admins = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name="tanks_of_admin",blank=True)
moderators = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name="tanks_of_moderator",blank=True)
name = models.CharField(max_length=40)
信号:
@receiver(pre_save,sender=Tank)
def set_attr_if_needed(instance,*args,**kwargs):
# set ttype
if not instance.ttype:
obj,_ = Type.objects.get_or_create(name='overhead tank')
instance.ttype = obj
@receiver(post_save,sender=Tank)
def create_device_offline_notification(instance,created,**kwargs):
if created:
Notification.query.fetch_or_create(instance,"device offline")
def __add_users_to_location(instance):
""" add tank's users to location's users """
location = instance.locations.filter(
location_type__name='Apartment').first()
if location:
location.users.add(*instance.users.all())
def __copy_addition_to_users(instance,users):
""" add moderators and admins to users list """
instance.users.add(*users)
@receiver(m2m_changed,sender=Tank.users.through)
def on_tank_users_change(instance,action,pk_set,**_):
if action == 'post_add':
__add_users_to_location(instance=instance)
elif action == 'post_remove':
instance.moderators.remove(*pk_set)
@receiver(m2m_changed,sender=Tank.moderators.through)
def on_tank_moderators_change(instance,**_):
if action == 'post_add':
__copy_addition_to_users(users=pk_set,instance=instance)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。