Python Web开发技巧VII

本文介绍了DjangoREST框架中的一些关键概念和实用技巧,包括使用inject_serializer装饰器动态注入序列化器,@atomic装饰器确保数据库事务的原子性,以及Git的rebase操作和清理暂存区的方法。此外,还涉及到了如何在Django中创建自定义API动作、选择性返回序列化器字段以及Response与JsonResponse的区别。
摘要由CSDN通过智能技术生成

目录

装饰器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() 等查询方法一起使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值