如何在不删除记录的情况下更改用户组

Ale*_*lex 2 django

在我的网站上,任何用户都只有一个组。任何用户都可以更改他的组。所以它是由

user.groups.clear() 
Run Code Online (Sandbox Code Playgroud)

user.groups.add(new_group)
Run Code Online (Sandbox Code Playgroud)

但是效率不高,因为有两个SQL查询:DELETE、INSERT。如何仅通过 UPDATE 查询更改组?

mgi*_*nbr 6

User并且Group使用ManyToManyField. 这意味着存在关联两个实体的交集表,如果您没有指定要映射到它的模型(使用through属性),Django 会为您创建一个。查看来源,django.contrib.auth.models我看到情况就是如此。

幸运的是,您可以使用through管理器的属性(在本例中为User.groups.through)访问该中间模型。然后您可以像使用任何常规模型一样使用它。例子:

>>> alice = User.objects.create_user('alice', 'alice@example.com', 'alicepw')
>>> employee = Group.objects.create(name='employee')
>>> manager = Group.objects.create(name='manager')

>>> alice.groups.add(employee)
>>> alice.groups.all()
[<Group: employee>]

>>> alice_group = User.groups.through.objects.get(user=alice)
>>> alice_group
<User_groups: User_groups object>
>>> alice_group.group = manager
>>> alice_group.save()

>>> alice.groups.all()
[<Group: manager>]
>>>
Run Code Online (Sandbox Code Playgroud)

(为了可读性添加了换行符)