[英]DRF: How to make serializer fields different depending on instance attributes
我對 DRF 或 Django 不太熟悉,但這里有:
我正在開發一個返回用戶的鍛煉 API,並且用戶能夠設置其個人資料的可見性。 該表看起來像:
id | username | email | coach_id | visibility
visibility
是public
、 coach
、 private
之一。
這意味着如果User 1
的visibility = private
,另一個用戶獲取他們的個人資料應該只看到屬性id
和username
,但用戶自己應該得到所有屬性。
如果visibility = public
或visibility = coach
,用戶的教練應該會看到個人資料。
我已經研究過動態設置序列化程序的fields
- 變量,但沒有運氣(因為字段應該根據對象/實例的內容“生成”)。
我還研究了extra_field = serializers.SerializerMethodField()
,但這導致所有值都顯示為extra_field
的子屬性。
我想知道的是:解決這個問題的最佳方法是什么?
我解決了!
我在序列化程序中使用了to_representation
-函數,如下所示:
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))
隨意指出此解決方案中的弱點,但它似乎對我很有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.