【问题标题】:django view filter ManyToMany field to guard viewdjango 视图过滤器 ManyToMany 字段来保护视图
【发布时间】:2023-01-15 10:24:32
【问题描述】:

我有一个标签模型,带有 ManyToMany 字段“parents”来标记模型本身。还有“allowed_users”字段。

我需要以这样一种方式保护视图,即用户不会在父母字段中看到任何他不允许的标签。

我尝试修改查询集,从父母那里删除相应的标签。但是当我更改实例时,tag_instance.parents.set(my_new_list) 它会自动保存,因此我正在更改数据库并更改实例的实际值。

所以一般的问题是“如何以这种方式保护我的观点,该对象的 ManyToMany 字段由自定义逻辑过滤”。

另一个问题是“如何在不改变数据库的情况下设置 manytomany 字段”,因为这将是前一个的解决方案。

是的,我使用 DRF

【问题讨论】:

    标签: django orm


    【解决方案1】:

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

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

    这将预取“parents”(意味着访问my_tag.parent.all() 时不会运行额外的 sql 查询)并过滤 parents 以仅保留 allowed_user 中的当前用户

    注意:Tag.objects.filter(allowed_users=current_user) 将为 allowed_user 中的每个用户复制标签条目,因此 .distinct() 保留每个标签条目之一

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2022-01-23
      • 2018-04-26
      • 2021-06-07
      • 2016-01-23
      • 1970-01-01
      • 2020-02-06
      相关资源
      最近更新 更多