越来越多的项目很简单,这是尝试技术事物的许多机会。实际上,我正是这样选择的:在业务方面减少了少量,我们可以在技术层面获得更多的果汁。
当然,这以非常特殊的方式适用于我的项目:在其他情况下,业务暗示了技术挑战,这很好,但是我对我们现在正在做的事情感到安慰。
在继续之前
进行一些测试,因为我使用了最后一个版本的DRF,当我制作“ API/颜色”时,我返回了以下内容:
Creating a ModelSerializer without either the 'fields' attribute or the 'exclude' attribute has been deprecated since 3.3.0, and is now disallowed. Add an explicit fields = '__all__' to the NestedSerializer serializer.
为解决这个问题,如该错误所说,将“ fields ='全部”添加到我的序列化器:
class ColorSerializer(ModelSerializer):
class Meta:
model = Color
fields = '__all__'
class VoteSerializer(ModelSerializer):
class Meta:
model = Vote
fields = '__all__'
depth = 1
我们继续使用通常的传输ð
所有模型视图集
要能够修改票数,我们需要了解如何改变父亲世界的行为,modelViewSet:
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
我们对评论感兴趣:
- 创建():创建新的投票。
- 检索():对您的ID进行投票。
- update() / partial_update():编辑总计或包裹投票。< / li>
- DESTION():Elimina Un voto。
- list():带上所有选票。
这看起来像我们看到hace un par de artículos的终点,正是因为他们想对所有人说。
产生投票
流程后,我们现在应该能够根据会话用户创建新的投票。首先,我们通过Auth Token限制了对终点的访问:
class VoteViewSet(viewsets.ModelViewSet):
(...)
authentication_classes = [TokenAuthentication]
现在,与投票有关的所有Mâ©都将需要我们以前生成的令牌。一旦拥有它,我们将其添加为标题AUTH:
投票内部具有关联的颜色,因此我们必须在投票式中指定它:
class VoteSerializer(ModelSerializer):
color = ColorSerializer(many=False, read_only=True)
那么我们必须重新定义我们的mâ©all doteviewset create:
def create(self, request, *args, **kwargs):
serializer = VoteSerializer(data=request.data)
if serializer.is_valid():
color = Color(**request.data['color'])
serializer.save(user=request.user, color=color)
return Response({
"success": True,
"message": "Voto emitido exitosamente.",
"vote": serializer.data
}, status=status.HTTP_201_CREATED)
else:
return Response({
"success": False,
"message": "Error al emitir Voto!",
"vote": serializer.errors
}, status=status.HTTP_400_BAD_REQUEST)
可能会注意到我接收 data 和用户。 用户属性是作为内部对象生成的,该对象已经通过内部解决了我们的身份验证器。
在 data 的情况下,我们必须通过JSON机构发送如下:
{
"color": {
"id": 1,
"name": "azul",
"hexa": "#360FFF"
}
}
我们指示的颜色对象可以通过端点“获取API/颜色”获得。
另一个重要的细节:要获取和携带ID字段,我们必须在序列化器中声明它:
class ColorSerializer(ModelSerializer):
id = IntegerField()
投票后,我们将得到这样的答案:
{
"success": true,
"message": "Voto emitido exitosamente.",
"vote": {
"id": 1,
"color": {
"id": 1,
"name": "azul",
"hexa": "#360FFF"
},
"user": {
"id": 1,
"password": "pbkdf2_sha256$600000$MTt324mR10bsmpz5WVycFV$B0Lj6QFYWgUKI2txcsxdnu4sW9T0ZSU/OB67JThJfdk=",
"last_login": "2023-04-12T14:13:56.147422Z",
"is_superuser": true,
"username": "admin",
"first_name": "",
"last_name": "",
"email": "",
"is_staff": true,
"is_active": true,
"date_joined": "2023-04-12T14:13:42.051901Z",
"groups": [],
"user_permissions": []
}
}
}
用户序列化器
上一个答案是正确的,但是它返回了太多的用户信息。甚至敏感。我们需要通过您自己的序列化器解决此问题:
class UserSerializer(ModelSerializer):
class Meta:
model = User
fields = ['username', 'first_name', 'last_name']
我们还必须将其包含在投票程序中:
user = UserSerializer(many=False, read_only=True)
现在,如果我们进行投票(Django-Admin删除了前一票,请记住您只能通过用户发布一个),这将返回我们:
{
"success": true,
"message": "Voto emitido exitosamente.",
"vote": {
"id": 2,
"color": {
"id": 1,
"name": "azul",
"hexa": "#360FFF"
},
"user": {
"username": "admin",
"first_name": "",
"last_name": ""
}
}
}
结论
这篇文章不会注意到它,但是我与嵌套序列化的人非常强烈。这些是包含他人的序列化器,例如在彩色投票的情况下。
但是,随着投票可能实施的可能性,现在只有对某个用户存在这些投票的证实。
,但这将是尊敬的读者,在下一章中。 ð