Python日记| #13。选择颜色:发放选票
#spanish #python #django #开发日志

越来越多的项目很简单,这是尝试技术事物的许多机会。实际上,我正是这样选择的:在业务方面减少了少量,我们可以在技术层面获得更多的果汁。

当然,这以非常特殊的方式适用于我的项目:在其他情况下,业务暗示了技术挑战,这很好,但是我对我们现在正在做的事情感到安慰。

在继续之前

进行一些测试,因为我使用了最后一个版本的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:

Postman Header 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": ""
        }
    }
}

结论

这篇文章不会注意到它,但是我与嵌套序列化的人非常强烈。这些是包含他人的序列化器,例如在彩色投票的情况下。

但是,随着投票可能实施的可能性,现在只有对某个用户存在这些投票的证实。

,但这将是尊敬的读者,在下一章中。 ð