无法更改模型上的m2m关系save()

时间:2014-06-15 14:50:57

标签: django django-orm

我有is_instructor字段的自定义用户模型,如果此值为True,则希望将用户添加到教师组。我尝试通过覆盖save()方法和使用信号来做到这一点,但它们都没有工作。

这不起作用:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    ...
    is_instructor = models.BooleanField(_('instructor'), default=False)
    ...

    def save(self, *args, **kwargs):
        ...
        super(CustomUser, self).save(*args, **kwargs)
        ins_group = Group.objects.get(name='Instructors')
        if self.is_instructor:
            self.groups.add(ins_group)    # No effect
        else:
            self.groups.remove(ins_group) # No effect

使用相同信号(不起作用):

@receiver(post_save, sender=CustomUser)
def update_groups(sender, instance, **kwargs):
    ins_group = Group.objects.get(name='Instructors')
    if instance.is_instructor:
        instance.groups.add(ins_group)    # No effect
    else:
        instance.groups.remove(ins_group) # No effect

虽然它在视图中正常工作:

def update_user(request, pk, template='userprofile/customuser_form.html'):
    ...
    profile = get_object_or_404(get_user_model(), id=pk)
    if request.method == 'POST':
        form = form_class(request.POST, instance=profile)
        if form.is_valid():
            u = form.save(commit=False)
            ins = Group.objects.get(name='Instructors')
            if u.is_instructor:
                u.groups.add(ins)    # Works
            else:
                u.groups.remove(ins) # Works
            u.save()
            redirect('userprofile:detail', u.pk)
    ...

但我还需要在模型中进行更新,以便在管理员中保存用户时更新组。我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

save()不适用于新实例,因为您在调用super之前尝试修改关系。

可能根本无法加载信号。你把它放进了哪个模块(models.py希望?)。检查update_groups是否在您预期的时候被调用。

作为旁注:在处理信号时,请记住尊重raw关键字参数。