2012-06-13 2 views
1

На моем сайте у любого пользователя есть только одна группа. И любой пользователь может изменить свою группу. Так это сделаноКак изменить группу пользователей без записи записи

user.groups.clear() 

и

user.groups.add(new_group) 

Но это не эффективно, потому что есть два SQL-запрос: DELETE, INSERT. Как изменить группу только с помощью запроса UPDATE?

+2

mgibsonbr ответ хорош, но мне было интересно, если у вас есть много пользователей, изменяя их группу каждый второй? Если это не так (это означает, что изменяющаяся группа не выполняется очень часто), вы не должны заботиться об этой неэффективности. Не делайте преждевременных оптимизаций. – Etienne

+0

Хорошо. Спасибо за совет. – Alex

ответ

2

User и Group связаны друг с другом с использованием ManyToManyField. Это означает, что существует таблица пересечений, связывающая оба объекта, и если вы не укажете модель для ее сопоставления (используя атрибут through), Django создает для вас одну. Глядя на источники для django.contrib.auth.models Я вижу, что это так.

Fortunatly, вы можете получить доступ к этой промежуточной модели, используя атрибут through менеджера (в данном случае User.groups.through). Тогда вы можете использовать его, как и любую обычную модель. Пример:

>>> alice = User.objects.create_user('alice', '[email protected]', '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>] 
>>> 

(переводы строк добавлены для читаемости)

+0

Спасибо, мужик! На самом деле, я не понимаю, как это сделать, но это работает! – Alex

Смежные вопросы