为了账号安全,请及时绑定邮箱和手机立即绑定

第5部分:为您的Django开销跟踪器API添加过滤器并增强分类模型、序列化器和视图的功能

开支分类器 — 分类

如果你喜欢这篇,请给我买杯咖啡哦!咖啡☕💖

构建一个既健壮又灵活的开销跟踪应用程序时,使用 Django Rest Framework (DRF) 可以大大简化这个过程。本文将逐步创建一个开销跟踪器的核心部分:分类模型。我们将从定义模型开始,逐步编写序列化器和视图,最终创建有效管理分类的端点。

1. 定义分类模型

首先,我们需要创建一个模型,用来分类支出,比如餐饮、房租、水电煤等。

    # models.py

    from django.db import models
    from django.contrib.auth.models import User

    # 用于处理支出类别的模型
    class Category(AbstractModel):
        name = models.CharField('名称', max_length=100, null=False, blank=False)
        description = models.TextField(null=True, blank=True)
        user = models.ForeignKey(User, on_delete=models.CASCADE)

        class Meta:
            verbose_name = "类别"
            verbose_name_plural = "类别"
            db_table = "db_category"

        def __str__(self):
            return self.name + " "

在该模型中:

  • name:一个必填字段,用于填写分类的名称。
  • description:一个可选的文本字段,用于提供额外的说明。
  • user:一个外键,关联到 User 模型,确保每个分类都与特定用户相关联。
2. 创建类别序列化器

在DRF中,序列化器起着关键作用,用于将复杂的数据类型(如Django模型)转换成JSON、XML或其他内容类型,同时也能反序列化。我们将创建几个序列化器来管理Category模型的各种使用场景。

    # category_serializer.py

    from rest_framework import serializers
    from model.models import Category

    # 用于读取 Category 实例详细信息的序列化器
    class CategoryReadSerializer(serializers.ModelSerializer):
        class Meta:
            model = Category
            fields = '__all__'

    # 分类列表序列化器
    class CategoryListSerializer(serializers.ModelSerializer):
        first_name = serializers.SerializerMethodField()

        class Meta:
            model = Category
            fields = ['id', 'name', 'description', 'user', 'first_name']

        # 获取用户的名
        def get_first_name(self, obj):
            return obj.user.first_name if obj.user else None

    # 创建 Category 实例的序列化器
    class CategoryWriteSerializer(serializers.ModelSerializer):
        class Meta:
            model = Category
            fields = ['id', 'name', 'description', 'user']

        # 创建(validated_data)
        def create(self, validated_data):
            return Category.objects.create(**validated_data)

    # 用于基本表示 Category 实例的序列化器,仅包含少量字段
    class CategorySerializer(serializers.ModelSerializer):
        class Meta:
            model = Category
            fields = ['id', 'name']

下面看看每个序列化器

  • CategoryReadSerializer :返回详细视图所需的所有字段。
  • CategoryListSerializer :添加了一个自定义字段 first_name,该字段提取用户的名(first name)。
  • CategoryWriteSerializer :用于创建新类别。
  • CategorySerializer :仅在需要类别名称和ID时使用。
3. 为类别创建视图

首先,我们将创建视图来处理关于分类的API请求。DRF中的类视图提供了一种强大且灵活的方式来定义端点,处理请求。

    # category_view.py

    from django.http import Http404
    from rest_framework import status
    from rest_framework.permissions import IsAuthenticated
    from rest_framework.response import Response
    from rest_framework.views import APIView
    from core.api_views import ExpenseTrackerRetrieveUpdateDestroyAPIView, ExpenseTrackerListCreateAPIView
    from core.serializers.category_serializer import CategoryListSerializer, CategoryReadSerializer, CategoryWriteSerializer, CategorySerializer
    from model.models import Category

    class CategoryListCreateAPIView(ExpenseTrackerListCreateAPIView):
        permission_classes = [IsAuthenticated]
        list_read_serializer_class = CategoryListSerializer
        read_serializer_class = CategoryReadSerializer
        write_serializer_class = CategoryWriteSerializer

        def get_queryset(self):
            pass

    class CategoryRetrieveUpdateDestroyAPIView(ExpenseTrackerRetrieveUpdateDestroyAPIView):
        queryset = Category.objects.filter(deleted=False)
        read_serializer_class = CategoryReadSerializer
        write_serializer_class = CategoryWriteSerializer

        def get_queryset(self):
            pass

        def delete(self, request, *args, **kwargs):
            pass

    class CategoryListView(APIView):
        pass

无具体内容可解释。

  • CategoryListCreateAPIView :处理为经过验证的用户列出和创建类别的视图。
  • CategoryRetrieveUpdateDestroyAPIView :负责检索、更新和删除特定类别的操作。
  • CategoryListView :一个简化版视图,提供基本信息的类别列表。

每个条目后加上了逗号以增强阅读流畅性,同时根据专家建议调整了部分表达以提高准确性与一致性。

4. 定义终端

我们需要将视图映射到URL模式中,使API接口端点变得可访问以便实现API的可访问性。

    # urls.py

    from django.urls import path
    from .views import CategoryListCreateAPIView, CategoryRetrieveUpdateDestroyAPIView, CategoryListView

    urlpatterns = [
        path('api/categories/', CategoryListCreateAPIView.as_view(), name='category-list-create'),  # 创建和列出分类
        path('api/categories/<int:pk>/', CategoryRetrieveUpdateDestroyAPIView.as_view(), name='category-detail-destroy'),  # 获取、更新或删除分类
        path('api/categories/list/', CategoryListView.as_view(), name='category-list'),  # 列出分类
    ]

在以下设置中:

  • category-list-create:列出所有类别和创建新类别。
  • category-detail-destroy:查看、更新或删除特定类别。
  • category-list:提供基本类别列表。
5. 添加过滤条件

为了进行更复杂的查询,您可以使用Django Filter Backend来为类别添加筛选。

    # 分类过滤器.py

    from django_filters import rest_framework as filters
    from model.models import Category

    class CategoryFilterSerializer(filters.FilterSet):
        name = filters.CharFilter(field_name='名称', lookup_expr='不区分大小写的包含')

        class Meta:
            model = Category
            fields = ['名称']


现在,用户可以根据名称筛选类别,搜索模糊匹配。

# 总结

按照本文中提到的步骤操作,您可以搭建一个全面且可扩展的API来管理支出跟踪器中的分类。Django Rest Framework提供的工具,配合结构良好的模型、序列化器、视图和端点,使得随着应用的扩展,维护和扩展会更加容易。

如果你觉得这篇文章有用,不要忘了与你的朋友和同事分享!欢迎你在下面留下你的想法或问题💬,如果这篇对你胃口,也别忘了点赞哦!👍😊

如果你喜欢这个,可以买我一杯[买我一杯咖啡](https://ko-fi.com/codewiz_dev)! ☕💖
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消