Django Rest框架:在读/写相关字段中过滤

时间:2017-10-31 00:52:31

标签: django django-rest-framework

我有UserGroup s,其中GroupPrimaryKeyRelatedField上的User。在撰写User时,我只想将其分配给当前用户所在的Group。在检索User时,我只想显示Group它与当前用户有共同之处。

例如,假设user_1属于group_1user_2属于group_2。如果user_1 ping我想要获得的LIST USERS端点:

[{'groups': [1], 'username': 'user_1'}, {'groups': [], 'username': 'user_2'}]

请注意,虽然group_2存在,但它未列在user_2的群组下,因为user_1不在其中。

到目前为止的想法:

  • 重载to_representation似乎只是改变了群组在群组列表中的显示方式,而不是它是否完全显示
  • some guides有关如何过滤此处可写的group选项,这意味着user_1无法将自己添加到{{} 1}}
  • some guides有关如何过滤只读字段的信息
  • 我可以将上述两个字段合并为一个只读字段和一个只写字段,建议here用于解决其他问题,但我不愿意。

我没有看到有关当前用户如何过滤单个读/写group_2的指南。 有什么想法吗?

我的代码:

RelatedField

1 个答案:

答案 0 :(得分:0)

这是我最终做的事情。我认为它运作得体,但如果有人有其他想法,请跳进去。

阻碍我的是对to_representation如何运作的错误假设。我想要的是改变我知道我想以某种形式显示的对象的表示(在这种情况下,通过过滤列表)。如果我想不显示该对象,那么最好在视图中处理。

to_representation设置任何单个对象的表示形式。我想过滤一个列表属性,所以我重载了to_representation来做到这一点:

    def to_representation(self, instance):
        representation = super().to_representation(instance)
        representation['groups'] = [x for x in representation['groups'] if x in [some_arbitrary_list_to_filter_against]]
        return representation

这会过滤以供阅读。要使过滤器适用于读/写,请确保多对多字段是RelatedField的自定义子类,如here所述。