django - DRF:如何根据实例属性使序列化器字段不同
问题描述
我对 DRF 或 Django 并不太熟悉,但这里有:
我正在开发一个返回用户的锻炼 API,并且用户能够设置其个人资料的可见性。该表看起来像:
id | username | email | coach_id | visibility
, ,visibility
中的一个在哪里。public
coach
private
这意味着如果User 1
has visibility = private
,另一个获取他们的个人资料的用户应该只看到属性id
和username
,但用户自己应该得到所有属性。
visibility = public
如果或,用户的教练应该会看到个人资料visibility = coach
。
我已经研究过动态设置序列化程序的fields
- 变量,但没有运气(因为应该根据对象/实例的内容“生成”字段)。
我也研究过extra_field = serializers.SerializerMethodField()
,但这导致所有值都显示为 的子属性extra_field
。
我想知道的是:解决这个问题的最佳方法是什么?
解决方案
我解决了!
我在我的序列化程序中使用了to_representation
-function,如下所示:
class VisibilityAwareUserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = get_user_model()
fields = [
"id",
"username",
"visibility",
"email",
"coach",
]
def to_representation(self, instance):
ret = super(PermissionAwareUserSerializer, self).to_representation(instance)
fields_to_pop = [
"email",
"coach",
]
if not self.userCanSeeObject(self.context['request'].user, instance):
[ret.pop(field,'') for field in fields_to_pop]
return ret
def userCanSeeObject(self, user, obj):
return ((obj.visibility == "public") or (obj.visibility == "coach" and obj.coach == user or obj == user) or (obj.visibility == "private" and obj == user))
随意指出此解决方案中的弱点,但它似乎对我很有效。
推荐阅读
- python - 如何检查具有一系列项目的列表是否存在于另一个列表中
- php - XPath 提取属性来自在 PHP 中
- spring - Spring JPA 存储库无法解析实体的属性
- scala - Gatling 场景检查状态,然后是响应标头。使用`checkIf`?
- javascript - 试图弄清楚 JSX.Element 的定义
- amazon-web-services - AWS API Gateway - 带有 HTTP API 的参数映射路径(覆盖:路径)
- r - 在带有过滤器的 dplyr mutate 中使用 sum
- php - PHP:在数据库中查找值并在插入数据之前进行转换
- python - 如何使用以json对象作为输入的列表查找字典的最大深度
- python - 消息:在 python selenium 中无法访问 chrome