我有一个项目模型

class Project(models.Model)
    name = models.CharField(max_length=255)
    members = models.ManyToManyField(User, related_name="members")

我使用一个基于类的更新视图来限制那些属于项目成员的用户.

class ProjectUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Project
    fields = ["name"]

    def test_func(self):
        members = self.get_object().members.all()
        if members.contains(self.request.user):
            return True
        return False

在通过Djang Debug工具栏查看SQL查询之后,我看到该查询重复了两次.

推荐答案

只需过滤queryset,只检索request.userProject成员的项目,因此:

class ProjectUpdateView(LoginRequiredMixin, UpdateView):
    model = Project
    fields = ['name']

    def get_querset(self):
        return Project.objects.filter(members=self.request.user)

Note:通常使用settings.AUTH_USER_MODEL [Django-doc]来表示用户模型比直接使用User model [Django-doc]更好.有关更多信息,请参阅referencing the User model section of the documentation.


Note:related_name=… parameter [Django-doc]

Django相关问答推荐

如何显示;Django认证系统;在模板中?

通过在其他查询中使用来过滤对象

更改Django的创建时间字段

如何将 ManyToManyField 与另一个 ManyToManyField 进行比较

Django ORM 查询优化问题

PyCharm:强制 Django 模板语法突出显示

django - 让用户登录到测试客户端

在 PyCharm 中运行 Django 测试

Django ModelForm 没有指定模型类

Django 管理命令参数

django npm 和 node 包架构

Django 模板列表的第一个元素

Celery 和 Django 简单示例

PyCharm 代码判断提示找不到模板文件,如何解决?

将 jQuery 脚本添加到 Django 管理界面

Django 在 css 文件中使用背景图像的方法

Django - 保存新对象时如何获取 self.id?

在 Django 中查询 top x 元素

Django:必须使用对象 pk 或 slug 调用通用详细视图

如何更改 ModelForm 中所有 Django 日期字段的默认小部件?