1 多表序列化
1.1 路由
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', views.BookView.as_view()),
path('books/<int:pk>', views.BookDetailView.as_view()),
]
1.2 视图类
from .models import Book,Author,AuthorDetail,Publish
from rest_framework.response import Response
from .serializer import BookSerializer
class BookView(APIView):
def get(self, request):
book_list=Book.objects.all()
ser=BookSerializer(book_list,many=True)
return Response(ser.data)
def post(self,request):
ser=BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'新增成功'})
else:
return Response({'code':101,'msg':'新增失败','err':ser.errors})
class BookDetailView(APIView):
def get(self, request,pk):
book=Book.objects.all().filter(pk=pk).first()
ser=BookSerializer(book)
return Response(ser.data)
def put(self,request,pk):
book = Book.objects.all().filter(pk=pk).first()
ser = BookSerializer(instance=book,data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'修改成功'})
else:
return Response({'code':101,'msg':'修改失败','err':ser.errors})
1.3 序列化类
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model=Book
fields=['nid','name','price', 'publish_detail', 'author_list', 'publish','authors']
extra_kwargs={
'publish':{'write_only':True},
'authors': {'write_only': True},
}
publish_detail=serializers.SerializerMethodField(read_only=True)
def get_publish_detail(self,obj):
print(obj)
return {'name':obj.publish.name,'city':obj.publish.city}
author_list=serializers.SerializerMethodField(read_only=True)
def get_author_list(self,obj):
author_list=[]
for author in obj.authors.all():
author_list.append({'name':author.name,'addr':author.author_detail.addr})
return author_list
1.4 模型类
from django.db import models
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
authors=models.ManyToManyField(to='Author')
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
'''
on_delete可以选择的请情况
-models.CASCADE 级联删除
-models.SET_NULL 关联字段置为空 null=True
-models.SET_DEFAULT 关联字段设为默认值 default=0
-models.DO_NOTHING 由于数据库有约束会报错,去掉外键关系(公司都不建立外键)
-on_delete=models.SET(值,函数内存地址) 设置上某个值,或者运行某个函数
'''
class AuthorDetail(models.Model):
nid = models.AutoField(primary_key=True)
telephone = models.BigIntegerField()
birthday = models.DateField()
addr = models.CharField(max_length=64)
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
def __str__(self):
return self.name
2 请求与响应
2.1 请求
-request.data
-request.query_params
-request.FILES
-项目配置文件中加入
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
],
}
class BookView(APIView):
parser_classes = [JSONParser,]
2.2 响应
from rest_framework.response import Response
data=None,
status=None,
headers=None,
-------最重要的-----
template_name=None,
content_type=None
-项目配置文件中加入
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES':[
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],
}
class BookView(APIView):
renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
3 视图介绍
class MyView(APIView):
queryset = None
serializer_class = None
class ListModelMixin():
def list(self, request):
book_list = self.qs
print(book_list)
ser = self.serializer_class(book_list, many=True)
print(ser.data)
return Response(ser.data)
class PublishView(MyView,ListModelMixin,CreateModelMixin):
serializer_class = PublishSerializer
qs = Publish.objects.all()
def get(self,request):
return super().list(request)
def post(self,request):
return super().create(request)
----有余力的----
补充
1 相对导入和绝对导入
2 django国际化配置
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
3 models 的级联删除相关
'''
on_delete可以选择的请情况
-models.CASCADE 级联删除
-models.SET_NULL 关联字段置为空 null=True
-models.SET_DEFAULT 关联字段设为默认值 default=0
-models.DO_NOTHING 由于数据库有约束会报错,去掉外键关系(公司都不建立外键)
-on_delete=models.SET(值,函数内存地址) 设置上某个值,或者运行某个函数
'''
4 原生django,如何向响应头写数据
def test(request):
obj=HttpResponse('ok')
obj['xxx']='ooo'
return obj
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY