开支分类器 — 分类
如果你喜欢这篇,请给我买杯咖啡哦!咖啡☕💖
构建一个既健壮又灵活的开销跟踪应用程序时,使用 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
模型,确保每个分类都与特定用户相关联。
在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时使用。
首先,我们将创建视图来处理关于分类的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
:提供基本类别列表。
为了进行更复杂的查询,您可以使用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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦