- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的应用程序中,我使用修改后的 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="")
我希望人们能够更改他们的帐户设置,(例如他们的密码、电子邮件、电话
,...)。
为此,我有一个像这样的序列化程序:
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)
像这样的 View :
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
参数,用户必须在我的一个应用程序上支付一些费用。
如何允许应用设置参数,但不允许用户直接更新?
注意:我还有其他使用密码凭证流的应用程序并且是客户端,因此有人可以通过它获取应用程序 token 。
最佳答案
如果我对问题的理解正确,您希望特定字段 (nbSessions
) 可由某些第三方应用通过相同的 API 端点写入,但普通用户不可写入。
我会这样做:创建两个不同的序列化器,一个用于第三方应用,另一个用于普通用户。
class UserSerializer(serializers.ModelSerializer):
"""
Serializer used by third-party apps.
All fields, including nbSessions, are writeable.
"""
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'cotisant', 'nbSessions', 'tel')
extra_kwargs = {
'password': {'write_only': True}
}
# ...
class RestrictedUserSerializer(UserSerializer):
"""
Serializer used by regular users.
All fields except nbSessions are writeable.
It inherits from UserSerializer so that common code is not duplicated.
"""
class Meta(BaseUserSerializer.Meta):
read_only_fields = ('nbSessions',)
在这里,如您所见,两个序列化程序之间的唯一区别是 RestrictedUserSerializer.Meta
中存在 read_only_fields
属性。
然后在您的 View 中,您可以检查您的请求以查看要使用的序列化程序类:
class UserViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if is_third_party_app(self.request.user):
return UserSerializer
return RestrictedUserSerializer
# ...
您可以进一步扩展此概念,并为普通用户、第三方应用程序、员工、管理员等提供不同的序列化程序类(可能继承自同一基类)。每个序列化程序都可以有其特定的字段集、验证规则和更新逻辑。
关于python - DRF - 如何使用 Oauth Toolkit 验证应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408230/
Redux Toolkit 在尝试更新嵌套数组上的状态时给了我突变错误,我认为它是使用 immer 来解决这个问题并简化 reducer。 我的商店看起来像: 状态 -> 表单 -> 部分 我想向现有
DragonRuby Game Toolkit 中好像没有按钮的概念。如何创建按钮等 UI 组件? 最佳答案 按钮(和任何其他 UI 组件)可以解构为 primitives: 按钮有一个点击空间(通常
我正在使用 DragonRuby Game Toolkit 构建游戏。 如何检测一个对象(例如 Sprite)是否与另一个 Sprite 发生碰撞? 这是放置在屏幕上的两个 Sprite 。关于如何检
我正在通过 Template Toolkit 文件为 Template Toolkit 制作一些文档。目标是显示我正在使用的代码以及代码的输出。现在,我正在复制代码并将所有“%”字符替换为“%”字符串
我真的很喜欢 Template Toolkit并且喜欢它如何与 Catalyst 一起使用,但我想要更多“网络高级”工具包。 它可能只是 Web 对象的 *.tt 文件包,例如:Selector、Se
我需要为我正在处理的应用程序使用 Surface 项目模板,但我也想使用 MVVM Light Toolkit。我发现我可以“添加 | 新项目...”并为 View 、 View 模型或定位器选择一个
我们一直在使用 google identity toolkit 在我们的 alpha 和 beta 网站上登录,它非常流畅、简单且易于操作(Alpha 和 beta 用户获得了特定的登录说明)。当我们
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我想为 OpenCV 安装 CUDA,但当前的工具包 (7.5) 与 Visual Studio 2015 不兼容。我的问题是 - 安装 VS 2013 Express 是否允许我在 2015 年使用
我在添加 时遇到上述错误extraReducer 到我的 创建切片。 这是一个 react 原生应用程序 这是我的代码: export const login = createAsyncThu
使用 RTK Query , 如何使用获取功能来更新另一个切片的状态? 本质上,我试图让所有相关状态彼此相邻,因此在使用 useLazyGetQuery 查询数据后,我想使用结果并将其存储在现有切片中
我想使用模板工具包获取一个随机数。它不必特别随机。我该怎么做? 最佳答案 嗯,如果您没有(或无法导入)Slash::Test,您可能会遇到问题。 从 TT 的“vanilla”安装,您可以简单地使用
我的计算机上插入了两个屏幕,想知道 JFrame 或 Toolkit 中是否有检测窗口在哪个屏幕上的方法? 我有这个代码: java.awt.Toolkit.getDefaultToolkit().g
我正在使用 java 获取屏幕的尺寸和分辨率。当我运行以下代码时,我得到以下输出。 Toolkit toolkit = Toolkit.getDefaultToolkit (); Dimension
import { createSlice } from '@reduxjs/toolkit' export const countersSlice = createSlice({ name:
我有一个 azure 函数,我想在 IntelliJ IDEA 中本地运行和测试。我按照此处列出的所有步骤进行操作:https://learn.microsoft.com/en-us/azure/az
使用 VBA 我想将当前 word 文档的副本发送到 Web 服务?如何将当前文档作为字节数组获取? 我知道如何使用网络服务只是不确定如何将当前文件作为二进制对象发送? 附言从今天早上开始我一直在使用
如果要通过插件系统添加函数和/或虚拟方法,我想将自己的指令添加到Template Toolkit中。在不深入Template::Grammar的情况下,是否容易做到这一点?还有什么我可以在CPAN上学
如何使用 RTK 将整个数组分配给我的 intialState 对象? 做state = payload或 state = [...state, ...payload]不更新任何东西。 例子: con
我正在为我的网站使用谷歌翻译器。我想隐藏谷歌翻译器的顶部栏让我知道如何隐藏那个? 请在此处查看我的网站链接 http://www.rewords.com让我知道我要隐藏那个酒吧? 谢谢 最佳答案 通过
我是一名优秀的程序员,十分优秀!