如何解决如何在 Django 信号中以编程方式更新 m2m 字段
我正在尝试自动更新模型类中的 m2m 字段。它是一个observe-execute if true 类型,这意味着如果我的模型实例具有某个属性,则将其分配给该组或该组。 模型类如下所示:
class User(AbstractBaseUser,PermissionsMixin):
is_worker = models.BooleanField(_('Worker'),default=False,help_text='register as a worker')
is_client = models.BooleanField(_('Client'),help_text='register as a client')
信号如下:
@receiver(post_save,sender=User)
def assign_user_to_group(sender,instance,**kwargs):
if instance.is_client:
instance.groups.add([g.pk for g in Group.objects.filter(name='clients')][0])
elif instance.is_worker:
instance.groups.add([g.pk for g in Group.objects.filter(name='workers')][0])
通常,我可能需要在我的实例上调用 save() 方法,但文档另有说明,再加上违抗只会让我
RecursionError
。
您能否建议一种更清洁的方法来最好地解决这个问题?谢谢。
编辑
我最终像这样扩展了模型的 save()
方法:
from django.db import transaction
def save(self,force_insert=False,force_update=False,*args,**kwargs):
instance = super(User,self).save(force_insert,force_update,**kwargs)
transaction.on_commit(self.update_user_group)
return instance
def update_user_group(self):
if self.is_worker:
self.groups.set([g.pk for g in Group.objects.filter(name='workers')])
elif self.is_client:
self.groups.set([g.pk for g in Group.objects.filter(name='clients')])
解决方法
您目前的方法有什么问题?在多对多关系上使用 .add()
应该足以更新关系,而无需调用 .save()
你也在做一个不必要的列表理解。执行 Group.objects.filter(name='workers')[0]
或 Group.objects.filter(name='workers').first()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。