目录
装饰器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
以上,
body_in
: 指定请求体的序列化器,这里使用的是serializers.SLZ1
。out
: 指定响应体的序列化器,这里使用的是serializers.SLZ2
。tags
: 对 API 分类,方便在生成的 API 文档中查找(比如swagger)。这里标签:项目A
。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 类,但它们之间存在一些差异。
-
来源:
Response
类来自 Django REST framework(DRF),通常在 DRF 视图和 APIView 中使用。JsonResponse
类是 Django 内置的,用于构建 JSON 响应。 -
内容类型:
Response
类可以处理多种内容类型(如 JSON、XML 等),默认情况下,它会根据客户端请求的 "Accept" 头选择合适的内容类型。JsonResponse
类专门用于构建 JSON 响应,其 "Content-Type" 头始终设置为 "application/json"。 -
序列化:
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()
等查询方法一起使用。