我正在開發一些具有社交功能的項目,並且需要讓用戶看到他的個人資料的所有詳細信息,但只能看到其他人的個人資料的公開部分。
有沒有辦法在一個ViewSet中做到這一點?在一個ViewSet中以每個對象爲基礎更改序列化程序?
這裏是我的模型的樣本:
class Profile(TimestampedModel):
user = models.OneToOneField(User)
nickname = models.CharField(max_length=255)
sex = models.CharField(
max_length=1, default='M',
choices=(('M', 'Male'), ('F', 'Female')))
birthday = models.DateField(blank=True, null=True)
對於這種模式,我想生日,例如,留民營。
在實際模型中有大約十幾個這樣的字段。
我的串行:
class FullProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
class BasicProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = read_only_fields = ('nickname', 'sex', 'birthday')
自定義權限我寫道:
class ProfilePermission(permissions.BasePermission):
"""
Handles permissions for users. The basic rules are
- owner and staff may do anything
- others can only GET
"""
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
else:
return request.user == obj.user or request.user.is_staff
我的視圖集:
class RUViewSet(
mixins.RetrieveModelMixin, mixins.UpdateModelMixin,
mixins.ListModelMixin, viewsets.GenericViewSet):
"""ViewSet with update/retrieve powers."""
class ProfileViewSet(RUViewSet):
model = Profile
queryset = Profile.objects.all()
permission_classes = (IsAuthenticated, ProfilePermission)
def get_serializer_class(self):
user = self.request.user
if user.is_staff:
return FullProfileSerializer
return BasicProfileSerializer
我想是request.user
自己的個人資料在要使用FullProfileSerializer
序列化的查詢集中,但其餘的使用BasicProfileSerializer
。
這是否可以使用DRF的API?
這似乎是最乾淨的方式來做到這一點,而不需要深入串行器內部,謝謝。 –