问题描述
我正在尝试做一些像这样简单的事情:
members = models.ManyToManyField(User, blank=True, null=True, unique=True)
但不允许唯一.在查看创建的表时,它使外键变得如此独特,我想象.
我希望能够将成员与代表一个组的模型相关联.该组可以没有成员,但我不希望同一成员能够两次加入该组.
我的想法是,如果我尝试这样做会抛出异常,但似乎没有抛出异常.
def join(request,id):用户 = request.usermygroup = Group.objects.get(id=id)mygroup.members.add(用户)mygroup.num_members += 1mygroup.save()
num_members 递增,因为没有抛出异常.管理实用程序中不会出现重复的用户.add()
是否静默失败?我是否应该在添加之前简单地检查用户是否已经包含在内?
首先,我不会使用 num_members
.相反,您可以使用 mygroup.members.count()
检查有多少成员.其次,多次添加成员并不能真正添加他们多次,所以你没问题.
Group
上用于 member
指向 User
的 ManyToManyField
是用单独的表实现的(类似于 group_group_users
),它具有 Group
和 User
的外键.一个用户可以有多个组,一个组也可以有多个用户,但group_group_users
中不能有两行相同的关系(即外键唯一在一起).
用法:
>>>group = Group.objects.get(pk=1)>>>用户 = User.objects.get(pk=1)>>>group.members.add(用户)>>># 按预期工作正常.让我们检查一下结果.>>>group.members.all()[]>>>group.members.add(用户)>>># 再次工作正常.让我们检查重复项.>>>group.members.all()[]>>># 工作得很好.I'm trying to do something simple like this:
members = models.ManyToManyField(User, blank=True, null=True, unique=True)
but unique isn't allowed. When looking at the table created, it makes foreign keys so uniqueness is implied I imagine.
I want to be able to associate members with this model representing a group. The group can have no members but I don't want the same member to be able to join the group twice.
My thought would be that an exception would be thrown if I try and do this but it seems that an exception is not thrown.
def join(request,id):
user = request.user
mygroup = Group.objects.get(id=id)
mygroup.members.add(user)
mygroup.num_members += 1
mygroup.save()
num_members is incremented, because no exception is thrown. Duplicate users don't appear in the admin utility. Does add()
fail silently? Should I just simply check if the user is contained already before adding?
For one, I wouldn't use num_members
. Instead, you can check how many members there are with mygroup.members.count()
. Secondly, adding members more than once doesn't really add them more than once, so you're fine.
A ManyToManyField
on Group
for member
pointing to User
is implemented with a separate table (something like group_group_users
) which has a foreign key to Group
and User
. A user can have multiple groups, and a group can have multiple users, but there can't be two rows in group_group_users
for the same relationship (ie, unique together foreign keys).
Usage:
>>> group = Group.objects.get(pk=1)
>>> user = User.objects.get(pk=1)
>>> group.members.add(user)
>>> # Worked fine as expected. Let's check the results.
>>> group.members.all()
[<User: foousername>]
>>> group.members.add(user)
>>> # Worked fine again. Let's check for duplicates.
>>> group.members.all()
[<User: foousername>]
>>> # Worked fine.
这篇关于Django - 强制执行 ManyToManyField 唯一项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!