我试着做一些简单的事情,比如:

members = models.ManyToManyField(User, blank=True, null=True, unique=True)

但"独一无二"是不允许的.当查看创建的表时,它会生成外键,因此我认为这意味着唯一性.

我希望能够将成员与代表一个组的模型相关联.该组可以没有成员,但我不希望同一个成员能够加入该组两次.

我的 idea 是,如果我try 这样做,就会抛出异常,但似乎没有抛出异常.

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会递增,因为不会引发异常.重复用户不会出现在管理实用程序中.add()人会默默地失败吗?我是否应该在添加之前判断用户是否已经被包含?

推荐答案

首先,我不会用num_members美元.取而代之的是,您可以查看mygroup.members.count()的会员数量.其次,添加多次成员实际上并不会添加多次,所以您没有问题.

指向UserGroupGroup上的ManyToManyField是用一个单独的表(类似于group_group_users)实现的,该表具有指向GroupUser的外键.一个用户可以有多个组,一个组可以有多个用户,但group_group_users中不能有两行对应于同一关系(即,一起使用唯一的外键).

用法:

>>> 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字段中显示超级用户

Django-Values()并按月分组

设置wagail开发环境时出现ImportError:";无法从';wagta.search;";导入名称.

更改Django的创建时间字段

如何创建复杂的查询?| ChartJS 和 Django

如何在Django模板中有条件地传递值给with变量?

来自日历的 Django 动态 url

如何将数据(具体归档)从views.py 传递到models.py

在 Django 模板中分页时如何正确显示与其父模型字段关联的所有内联字段?

组织大型 Django 元素的指南

如何在 Django 视图中获取 URL 参数?

可以在基于 Django 类的视图中设置实例变量吗?

(fields.E300) 字段定义与模型的关系,该模型要么未安装,要么是抽象的

is_valid() vs clean() Django 表单

virtualenv(python3.4), pip install mysqlclient 错误

如何在 django 中捕获UNIQUE constraint failed404

Django 应用程序运行良好,但收到 TEMPLATE_* 警告消息

如何在 Python 中运行另一个脚本而不等待它完成?

在 Django 中使用 select_related Select 特定字段

django/文件上传权限