django视图过滤器ManyToMany字段到保护视图

s4n0splo  于 2023-01-18  发布在  Go
关注(0)|答案(1)|浏览(146)

我有一个标记模型,有ManyToMany字段“parents”给标记模型,给它自己。还有“allowed_users”字段。
我需要以这样一种方式保护视图,用户不会看到父母字段中的任何标记,他是不允许的。
我试图修改queryset,从父对象中删除相应的标签,但是当我修改示例tag_instance.parents.set(my_new_list)时,它会自动保存,所以我修改了数据库,修改了示例的真实的值。
因此,一般的问题是“如何以这样一种方式保护我的视图,即该对象的ManyToMany字段被自定义逻辑过滤”。
另一个问题是“如何在不改变数据库的情况下设置manytomany字段”,因为这将是前一个问题的解决方案。
是,我使用DRF

2w2cym1i

2w2cym1i1#

在执行SQL查询时,可以使用Prefetch对象过滤相关表。
例如:

Tag.objects.preftech_related(Prefetch("parents", queryset=Tag.objects.filter(allowed_users=current_user).distinct()))

这将预取"父项"(意味着在访问my_tag.parent.all()时不会运行其他sql查询),并过滤父项以仅保留allowed_user中当前用户的父项
注意:Tag.objects.filter(allowed_users=current_user)将为allowed_user中的每个用户复制标记条目,因此.distinct()将保留每个条目中的一个

相关问题