簡體   English   中英

DRF:如何根據實例屬性使序列化器字段不同

[英]DRF: How to make serializer fields different depending on instance attributes

我對 DRF 或 Django 不太熟悉,但這里有:

我正在開發一個返回用戶的鍛煉 API,並且用戶能夠設置其個人資料的可見性。 該表看起來像:

id | username | email | coach_id | visibility

visibilitypubliccoachprivate之一。

這意味着如果User 1visibility = private ,另一個用戶獲取他們的個人資料應該只看到屬性idusername ,但用戶自己應該得到所有屬性。

如果visibility = publicvisibility = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM