Python Web开发技巧VII

目录

装饰器inject_serializer

装饰器@atomic

rebase

git 清理add的数据

查看git的当前工作目录

makemigrations文件名称

@action(detail=True, methods=["GET"])

如何只取序列化器的一个字段进行返回

Response和JsonResponse有什么区别

序列化器填表和单字段如何写

序列化器里包含多对象数据-序列化器嵌套序列化器

from django.db.models import Q的Q对象有什么用,是什么


装饰器inject_serializer

        用于动态地将一个序列化器(serializer)注入到Django REST framework(DRF)视图中。

举个例子:

from blue_krill.web.drf_utils import inject_serializer



    @inject_serializer(
        body_in=serializers.SLZ1, out=serializers.SLZ2, tags=["项目A"], operation_summary="获取B"
    )
    def xxx(self, request, args):
        pass

以上,

  1. body_in: 指定请求体的序列化器,这里使用的是 serializers.SLZ1
  2. out: 指定响应体的序列化器,这里使用的是 serializers.SLZ2
  3. tags: 对 API 分类,方便在生成的 API 文档中查找(比如swagger)。这里标签:项目A
  4. operation_summary: 提供 API 的简短描述,这里描述:获取B。 

通过该装饰器,可以让 API 接口更具可读性和规范性,同时也能方便生成 API 文档。

在swagger中的显示就是:

装饰器@atomic

在 Django 中用于确保一个函数或方法在数据库中执行的操作具有原子性。

from django.db.transaction import atomic  # transaction 即事务的意思

@atomic
def create_user_and_profile(username, email, age):
    user = User.objects.create(username=username, email=email)
    profile = UserProfile.objects.create(user=user, age=age)

相当于在视图函数中开了个事务,主要目的是维护DB的一致性和完整性。

rebase

大家可能都是常用merge去合并,这样能保留具体的commit记录,但对不复杂或说不大型的项目,rebase其实更简洁干净些。

git checkout v1
git rebase master

v1合并到master,往往还要解决冲突,就处理后git add <File>然后git rebase

git 清理add的数据

从暂存区中移除单个文件

git restore --staged <file-path>

从暂存区中移除多个文件

git restore --staged <file-path-1> <file-path-2> ...

 从暂存区中移除所有文件(原来冒红冒黄的文件又恢复冒红冒黄):

git restore --staged .

查看git的当前工作目录

场景:比如git add需要直接加文件的方式

git rev-parse --show-toplevel

makemigrations文件名称

为让迁移文件更加清晰目的,迁移文件往往是要命名规范的,指定生成文件名称:

python manage.py makemigrations --name xxxx
python manage.py makemigrations -n xxxx

如果意外直接创建了,那么修改文件名即可,但前缀的0001这种数字不要去修改,关联到这个文件名的name也要修改(比如一般是下一个迁移文件用到),即可。

但注意,如果已经migrate的,那么需要在django_migration修改对应表名,如果为migrate那就不需要。

@action(detail=True, methods=["GET"])

detail标识是否针对单个对象,

@action(detail=True, methods=["GET"]) =》 /users/{id}/get_username/

@action(detail=False, methods=["GET"]) =》 /users/get_username/

如何只取序列化器的一个字段进行返回

from rest_framework import serializers
from myapp.models import MyModel

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ['field_name', 'another_field']

# 假设你已经有一个 MyModel 实例
my_model_instance = MyModel.objects.get(pk=1)

# 使用序列化器序列化实例
serializer = MyModelSerializer(my_model_instance)

# 获取序列化后的数据
serialized_data = serializer.data

# 仅提取名为 'field_name' 的字段
field_name_data = serialized_data['field_name']

# 返回或使用 'field_name' 字段的值
return field_name_data

Response和JsonResponse有什么区别

Response 和 JsonResponse 都是用于构建和返回 HTTP 响应的 Django 类,但它们之间存在一些差异。

  1. 来源Response 类来自 Django REST framework(DRF),通常在 DRF 视图和 APIView 中使用。JsonResponse 类是 Django 内置的,用于构建 JSON 响应。

  2. 内容类型Response 类可以处理多种内容类型(如 JSON、XML 等),默认情况下,它会根据客户端请求的 "Accept" 头选择合适的内容类型。JsonResponse 类专门用于构建 JSON 响应,其 "Content-Type" 头始终设置为 "application/json"。

  3. 序列化Response 类可以与 DRF 序列化器一起使用,自动序列化和反序列化数据。JsonResponse 类仅处理已序列化为 JSON 的数据,您需要确保传递给 JsonResponse 的数据是 JSON 可序列化的(例如 Python 字典、列表等)。

如果正使用 Django REST framework 构建 API,建议使用 Response 类。如果您正在使用 Django 的基本视图或类视图,并需要返回 JSON 数据,可以使用 JsonResponse 类

序列化器填表和单字段如何写

class HahaSLZ(serializers.Serializer):
    haha_id = serializers.IntegerField(required=False)

    class Meta:
        model = User
        fields = [field.name for field in User._meta.get_fields()] + ['haha_id']  # 注,直接__all__并不能涵盖haha_id

序列化器里包含多对象数据-序列化器嵌套序列化器

results该字段的类型是 AASLZ,并设置了 many=True 参数,表示这是一个列表,其中包含多个 AASLZ实例。

class AASLZ(serializers.Serializer):
    user = serializers.CharField(help_text="用户", required=True)

class BBSLZ(serializers.Serializer):
    results = AASLZ(help_text="用户列表", many=True)

from django.db.models import Q的Q对象有什么用,是什么

Django 的 Q 对象是一个用于构建更复杂查询的工具。它允许您在查询中使用 OR 语句、NOT 语句以及更高级的查询结构。Q 对象可以与 filter()exclude() 和 get() 等查询方法一起使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/50239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

红黑树与平衡二叉树

文章目录 前言一、平衡二叉树二、红黑树区别 前言 数据库的底层用到了多种树结构&#xff0c;这里简单记录一下红黑树与平衡二叉树。 一、平衡二叉树 满足二叉树。任何节点的两个子树的高度最大差为1。如果对平衡二叉树进行删除和新增&#xff0c;那么会破坏平衡&#xff0c;…

JavaSE - Sting类

目录 一. 字符串的定义 二. String类中的常用方法 1. 比较两个字符串是否相等&#xff08;返回值是boolean类型&#xff09; 2. 比较两个字符串的大小&#xff08;返回值是int类型&#xff09; 3. 字符串查找 &#xff08;1&#xff09;s1.charAt(index) index:下标&…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来计算相机的实时帧率&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在BGAPI SDK里通过函数获取相机帧率 Baumer工业相机通过BGA…

剑指 Offer 26. 树的子结构

思路&#xff1a; 先统计B数的非空节点数countB。然后前序遍历A&#xff0c;当遇到A的值和B的第一个值相等时&#xff0c;则进行统计左右结构和值都相等的节点数和sum&#xff0c;如果sum countB&#xff0c;则true。 /*** Definition for a binary tree node.* public class…

CSS 高频按钮样式

矩形与圆角按钮 正常而言&#xff0c;我们遇到的按钮就这两种 -- 矩形和圆角&#xff1a; 它们非常的简单&#xff0c;宽高和圆角和背景色。 <div classbtn rect>rect</div><div classbtn circle>circle</div>.btn {margin: 8px auto;flex-shrink: 0;…

网络设备中的配置文件管理

建立强大网络的第一步是为灾难和网络中断做好准备&#xff0c;许多企业在中断期间遭受损失&#xff0c;因为他们缺乏备份计划并且配置管理不达标&#xff0c;使用配置文件管理工具进行适当的配置文件管理不仅有助于处理网络中断&#xff0c;还有助于优化网络性能。 使用配置文…

Redis 集群部署

Redis 3.0 版本后正式推出 Redis 集群模式,该模式是 Redis 的分布式的解决方案,是一个提供在多个 Redis 节点间共享数据的程序集,且 Redis 集群是去中心化的,它的每个 Master 节点都可以进行读写数据,每个节点都拥有平等的关系,每个节点都保持各自的数据和整个集群的状态…

QT控件通过qss设置子控件的对齐方式、大小自适应等

一些复杂控件&#xff0c;是有子控件的&#xff0c;每个子控件&#xff0c;都可以通过qss的双冒号选择器来选中&#xff0c;进行独特的样式定义。很多控件都有子控件&#xff0c;太多了&#xff0c;后面单独写一篇文章来介绍各个控件的子控件。这里就随便来几个例子 例如下拉列…

Java | 数组排序算法

一、冒泡排序 冒泡排序的基本思想是对比相邻的元素值&#xff0c;如果满足条件就交换元素值&#xff0c;把较小的元素移到数组前面&#xff0c;把较大的元素移到数组后面&#xff08;也就是交换两个元素的位置&#xff09;&#xff0c;这样较小的元素就像气泡一样从底部升到顶…

Vue中使用Typescript及Typescript基础

准备工作 新建一个基于ts的vue项目 通过官方脚手架构建安装 # 1. 如果没有安装 Vue CLI 就先安装 npm install --global vue/cli最新的Vue CLI工具允许开发者 使用 TypeScript 集成环境 创建新项目。 只需运行vue create my-app 然后选择选项&#xff0c;箭头键选择 Manuall…

【Git】初始化仓库配置与本地仓库提交流程

目录 一、仓库配置邮箱与用户名 二、本地仓库提交流程 一、仓库配置邮箱与用户名 【Git】Linux服务器Centos环境下安装Git与创建本地仓库_centos git仓库搭建_1373i的博客-CSDN博客https://blog.csdn.net/qq_61903414/article/details/131260033?spm1001.2014.3001.5501 在…

Rocket-Spring Cloud Stream

一.Spring Cloud Stream简介 1.微服务中会经常使用消息中间件&#xff0c;通过消息中间件在服务与服务之间传递消息&#xff0c;例如RabbitMQ、Kafka和RocketMQ&#xff0c;无论使用哪一种消息中间件和服务之间都有一点耦合性&#xff0c;这个耦合性指的是原来使用RabbitMQ&am…

JenKins工作流程

程序员提交代码到Git/SVN仓库&#xff0c;触发钩子程序向 JenKins 进行通知&#xff0c;Jenkins 调用Git/SVN插件获取源码&#xff0c;调用Maven打包为war包&#xff0c;调用Deploy to web container插件部署到Tomcat服务器。

vue利用echarts简单实现具有中心节点的知识图谱

效果展示 边缘节点可拖动&#xff0c;其大小可以根据传入的值而变化&#xff08;比如我更喜欢芒果&#xff0c;所以给了芒果更大的权值&#xff0c;在显示的时候芒果所在的节点显示的比例更大&#xff09; 代码下载 https://download.csdn.net/download/David_house/881151…

【小梦C嘎嘎——启航篇】类和对象(上篇)

【小梦C嘎嘎——启航篇】类和对象&#xff08;上篇&#xff09;&#x1f60e; 前言&#x1f64c;什么是面向过程&#xff1f;什么是面向对象&#xff1f;什么是类和对象类中的访问权限属性类的大小计算this 指针构造函数析构函数 总结撒花&#x1f49e; &#x1f60e;博客昵称&…

redis(12):springboot使用redis注解做缓存

1 新建springboot项目 2 相关注解 @EnableCaching 在启动类上加上注解启动缓存 #作用在你要缓存的数据上 @Cacheable(key="#id",cacheNames="com.sxt.service.impl.MenuServiceImpl") @Cacheput 解决脏读 @CachEvict(解决脏读) @Cacheconfig(全…

Reinforcement Learning with Code 【Chapter 9. Policy Gradient Methods】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

【COlor传感器】通过扰动调制光传感实现智能光传输的占用分布估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Mysql 数据库开发及企业级应用

文章目录 1、Mysql 数据库开发及企业级应用1.1、为什么要使用数据库1.1.1、数据库概念&#xff08;Database&#xff09;1.1.2、为什么需要数据库 1.2、程序员为什么要学习数据库1.3、数据库的选择1.3.1、主流数据库简介1.3.2、使用 MySQL 的优势1.3.3、版本选择 1.4、Windows …

神码ai火车头伪原创插件怎么用【php源码】

大家好&#xff0c;本文将围绕python绘制烟花特定爆炸效果展开说明&#xff0c;如何用python画一朵花是一个很多人都想弄明白的事情&#xff0c;想搞清楚用python画烟花的代码需要先了解以下几个事情。 1、表白烟花代码 天天敲代码的朋友&#xff0c;有没有想过代码也可以变得…