Django - 强制执行 ManyToManyField 唯一项 [英] Django - enforcing ManyToManyField unique items

查看:25
本文介绍了Django - 强制执行 ManyToManyField 唯一项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试做一些像这样简单的事情:

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 指向 UserManyToManyField 是用单独的表实现的(类似于 group_group_users),它具有 GroupUser 的外键.一个用户可以有多个组,一个组也可以有多个用户,但group_group_users中不能有两行相同的关系(即外键唯一在一起).

用法:

<预><代码>>>>group = Group.objects.get(pk=1)>>>用户 = User.objects.get(pk=1)>>>group.members.add(用户)>>># 按预期工作正常.让我们检查一下结果.>>>group.members.all()[<用户:foousername>]>>>group.members.add(用户)>>># 再次工作正常.让我们检查重复项.>>>group.members.all()[<用户:foousername>]>>># 工作得很好.

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 唯一项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆