1.二次封装Response
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, status=0, msg='ok', results=None, http_status=None, headers=None, exception=False, **kwargs ):
data = {
'status': status,
'msg': msg
}
if results is not None:
data['results'] = results
data.update(**kwargs)
super().__init__( data=data, status=http_status, headers=headers, exception=exception)
return APIResponse(1, 'pk error', http_status=400)
2.设置基表
# 设置了abstract为True的模型类,称之为基表,这样的模型类是专门作为基类来提供共有属性的.
eg:
class BaseModel(models.Model):
is_delete = model.BoolenField(default=False)
create_time = model.DateTimeField(auto_now_add=True) # 一般重复的字段
class Meta:
# 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表,就是说这个模板表不会被创建.
abstract = True
# 使用(可以多个表共同使用)
class Book(BaseModel): # 继承BaseModel,那么话就不用重写在写基类里面出现的字段.
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
3.ORM多表关联操作:
外键所放位置:
一对多: 外键字段在多的一方
多对多: 外键在常用的一方
一对一: 外键在不常用的一方(如:作者可以没有详情,但是详情不能没有作者.)
eg:
class Author(BaseModel):
name = models.CharField(max_length=32)
sex = models.IntegerField(choices=[(0,'男'),(1,'女')], default=0)
class AtthoriDetail(BaseModel):
info = models.CharField(max_length=255)
author = models.OneToOneField(to='Author', related_name='detail', db_constraint=False, on_delete=models.CASCADE) # 放在不常用的作者详情表里
# 1.related_name='detail', 是规定反向查询字段,作者查详情是反向,可以通过这个字段来拿信息
# 2.db_constraint=False, 让这个外键字段断开关联.
关于外键间的级联关系on_delete字段的使用(在使用db_constraint断开关联之后使用.)
一对一: 作者没了,详情也就没了: on_delete=models.CASCADE
一对多: 出版社没了,书还是哪个出版社出版的: on_delete=models.DO_NOTHING
一对多: 部门没了,员工没有部门: null=True, on_delete=models.SET_NULL
一对多: 部门没了,员工进入默认部门(默认值): default=0, on_delete=models.SET_DEFAULT
多对多字段: 不能设置on_delete
4.联表序列化
class Book(BaseModel):
name = models.CharField(max_length=16)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish', related_name='books', db_constraint=False, on_delete=models.DO_NOTHING)
authors = models.ManyToManyField(to='Author', related_name='books', db_constraint=False)
@property
def publish_name(self):
return self.publish.name
@property
def author_list(self):
temp_author_list = []
for author in self.authors.all():
temp_author_list.append({
'name': author.name,
'sex': author.get_sex_display(),
'mobile': author.detail.mobile
})
return temp_author_list
5.子序列化
from rest_framework import serializers
from . import models
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = ['name', 'price', 'publish_name', 'author_list', 'publish', 'authors']
extra_kwargs = {
'publish': {
'write_only':True
},
'authors': {
'write_only': True
}
}
class PublishModelSerializer(serializer.ModelSerializer):
books = BookModelSerializer(many=True)
class Meta:
model = models.Publish
fields = ['name', 'address', 'books']
6.单查群查接口
class BookAPIView(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
book_obj = models.Book.objects.filter(pk=pk, is_delete_False).first
if not book_obj:
return APIResponse(1, 'pk error', http_status=400)
book_data = serializers.BookModelSerializer(book_obj).data
return APIResponse(results=book_data)
book_query = models.Book.object.filter(is_delete=False).all()
return APIResponse(0, 'ok',data=serializers.BookModelSerializer(book_query, many=True).data)
7.单删群删接口
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
pks = [pk]
else:
pks = request.data.get('pks')
if not pks:
return APIResponse(1, 'delete error', http_status=400)
rows = models.Book.object.filter(is_delete=False, pk__in=pks).update(is_delete=True)
if rows:
return APIResponse(0, 'delete ok')
return APIReponse(1, 'delete failed')
8.单增群增接口
def post(self, request, *args, **kwargs):
request_data = request.data
if isinstance(request_data, dict):
book_ser = serializer.BookModelSerializer(data=request_data)
if book_ser.is_valid():
book_obj = book_ser.save()
retutn APIResponse(results=serializers.BookModelSerializer(book_obj).data)
return APIResponse(1, msg=book_ser.errors)
elif isinstance(request_date, list) and len(request_data) != 0:
book_ser = serializers.BookModelSerializer(data=request_data, many=True)
book_ser.is_valid(raise_exception=True)
book_obj_list = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)
9.单群整体改
(和新增基本相同,只需要给instance赋值你要修改的对象)
1.序列化类参数instance=修改的对象, data=修改的数据, partial=是否能过局部修改,单整体修改就是pritial=False(默认就是False)
def patch(self, request, *args, **kwargs):
pk = kwargs.get('pk')
request_data = request.data
if pk:
try:
book_obj = models.Book.object.get(pk=pk)
except:
return APIResponse(1, 'pk error')
book_ser = serializers.BookModelSerializer(instance=book_obj, data=request_data)
book_ser.is_valid(raise_exception=True)
book_obj = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj).data)
else:
if not isinstance(request_data, list) or len(request_data) == 0:
return APIResponse(1, 'data error', http_status=400)
obj_list = []
data_list = []
for dic in request_data:
try:
pk = dic.pop('pk')
try:
obj = models.Book.objects.get(pk=pk, is_delete=False)
obj_list.append(obj)
data_list.append(dic)
except:
pass
except:
return APIResponse(1, 'data error', http_status=400)
book_ser = serializers.BookModelSerializer(instance=obj_list, data=data_list, many=True)
book_ser.is_valid(raise_exception=True)
book_obj_list = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)
10.单群局部改
def patch(self, request, *args, **kwargs):
"""
单整体改:前台提交字典,接口 /books/(pk)/
群整体改:前台提交列表套字典,接口 /books/,注每一个字典都可以通过pk
"""
pk = kwargs.get('pk')
request_data = request.data
if pk:
try:
book_obj = models.Book.objects.get(pk=pk)
except:
return APIResponse(1, 'pk error')
book_ser = serializers.BookModelSerializer(instance=book_obj, data=request_data, partial=True)
book_ser.is_valid(raise_exception=True)
book_obj = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj).data)
else:
if not isinstance(request_data, list) or len(request_data) == 0:
return APIResponse(1, 'data error', http_status=400)
obj_list = []
data_list = []
for dic in request_data:
try:
pk = dic.pop('pk')
try:
obj = models.Book.objects.get(pk=pk, is_delete=False)
obj_list.append(obj)
data_list.append(dic)
except:
pass
except:
return APIResponse(1, 'data error', http_status=400)
book_ser = serializers.BookModelSerializer(instance=obj_list, data=data_list, many=True, partial=True)
book_ser.is_valid(raise_exception=True)
book_obj_list = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)
11.需要注意
class BookListSerializer(serializer.ListSerializer):
return [
self.child.updata(instance[i], attrs) for i, attrs in enumerate(validated_data)
]
class Meta:
list_serializer_class = BookListSerializer
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee