【发布时间】:2018-07-02 15:46:21
【问题描述】:
在我的应用程序中,我使用了修改后的 User 模型,其中包含我需要的另外 3 个字段。
from django.contrib.auth.models import AbstractUser
from django.db import models
import ldapdb.models
class User(AbstractUser):
cotisant = models.BooleanField(default=False)
nbSessions = models.IntegerField(default=0)
tel = models.CharField(max_length=20, default="")
我希望人们能够更改他们的帐户设置(例如他们的密码、电子邮件、tel...)。
为此,我有一个这样的序列化程序:
from rest_framework import serializers
from django.contrib.auth.hashers import make_password
from coreapp.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'cotisant', 'tel')
extra_kwargs = {
# Allow to set pwd, but disallow getting the hash from database
'password': {'write_only': True}
}
def validate_password(self, value: str):
return make_password(value)
还有这样的视图:
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
permission_classes = (IsSelfOrStaffPermission, TokenHasReadWriteScopeOrCreate,)
lookup_field = 'username'
def get_queryset(self):
current_user = self.request.user
if current_user.is_staff:
user_set = User.objects.all()
else:
user_set = User.objects.filter(username=current_user.username)
query = self.request.query_params.get('q', None)
if not query:
return user_set
return user_set.filter(
Q(username__icontains=query) |
Q(first_name__icontains=query) |
Q(last_name__icontains=query)
)
(这只允许用户访问他自己,除非他是员工)
问题是,要更新nbSessions 参数,用户必须在我的一个应用上付费。
如何允许应用设置参数,但不允许用户直接更新?
注意:我有其他应用程序使用密码凭据流并且是客户端,因此有人可以通过它获取应用程序令牌。
【问题讨论】:
-
您的问题标题似乎与您的问题正文不匹配。你确定它准确吗?
标签: python django rest oauth django-rest-framework