一、序列化组件

环境配置:

使django支持Mysql(前面已有介绍,这里不再重复)

使django支持framework

在settings.py中的INSTALLED_APPS字段添加:

"rest_framework"

序列化组件的使用

-Serializer-1重命名:用source:xx=serializers.CharField(source='name')-2取出出版社名字:方式一:-在模型表中重写__str__方法-publish=serializers.CharField()方式二:-用source-拿出出版社的城市-publish=serializers.CharField(source='publish.city')*****如果不指定source,字段必须对应起来,如果指定了source,字段可以任意命名-source可以指定字段,也可也指定方法publish.test这是个方法,会执行该方法,并拿到返回结果test=serializers.CharField(source='publish.test')-3SerializerMethodField,可以指定一个方法publish=serializers.SerializerMethodField()#方法名:叫get_字段名,要传参数,参数是:当前book对象defget_publish(self,obj):#obj是当前book对象dic={'name':obj.publish.name,'email':obj.publish.email}returndic-方法内部可以继续用其他的序列化类-ModelSerializer-必须在类中写classMeta:model=指定表#fields='__all__'#指定只取这两个字段fields=['nid','name']#去掉指定的字段#exclude=['publish','authors']#fields,跟exclude不能连用#指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3)#depth=2

urls.py

url(r'^books/',views.Books.as_view()),

views.py

fromdjango.shortcutsimportrenderfromapp01importmodels#Createyourviewshere.fromrest_framework.viewsimportAPIViewfromapp01.serverimportBookSerializerfromdjango.httpimportJsonResponseclassBooks(APIView):defget(self,request,*args,**kwargs):#ret=models.Book.objects.all()#生成一个序列化的对象,传参数#序列化多条,记住many=Truebook_ser=BookSerializer(ret,many=True)print(book_ser.data)#safe=False可以序列化列表returnJsonResponse(book_ser.data,safe=False

models.py

fromdjango.dbimportmodels#Createyourmodelshere.classBook(models.Model):nid=models.AutoField(primary_key=True)name=models.CharField(max_length=32)price=models.DecimalField(max_digits=5,decimal_places=2)publish_date=models.DateField()#外键对应数据库表中的字段名后面会自动加"_id"#on_delete=models.CASCADE级联删除publish=models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)#ManyToManyField自动创建第三张表,本表名_到你对应多的表名名字,自动帮你把表名转小写authors=models.ManyToManyField(to='Author')def__str__(self):returnself.nameclassAuthor(models.Model):nid=models.AutoField(primary_key=True)name=models.CharField(max_length=32)age=models.IntegerField()author_detail=models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)classAuthorDatail(models.Model):nid=models.AutoField(primary_key=True)telephone=models.BigIntegerField()birthday=models.DateField()addr=models.CharField(max_length=64)classPublish(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):returnself.namedeftest(self):returnself.email

最后使用:

python3 manage makemigrations
python3 manage migrate


app01/server.py

fromrest_frameworkimportserializers#classAuthorSerializer(serializers.Serializer):#nid=serializers.CharField()#name=serializers.CharField()#age=serializers.CharField()#classBookSerializer(serializers.Serializer):##可以用source修改别名##-source可以指定字段,也可也指定方法#abc=serializers.CharField(source='name')#对应models.py中Book类中的name字段,这里的名字必须要和Book类中的name字段相互匹配#price=serializers.CharField()##-source可以指定字段,也可也指定方法#publish_alias=serializers.CharField(source='publish.city')#publish_id=serializers.CharField()##可以指定并运行方法中的函数,并拿到返回结果#test_auth=serializers.CharField(source='publish.test')##SerializerMethodField,可以指定一个方法#publish=serializers.SerializerMethodField()###函数名必须是get_字段名,要传参数,参数是:当前book对象#defget_publish(self,obj):#dic={'name':obj.publish.name,'email':obj.publish.email}#returndic##authors=serializers.SerializerMethodField()###方式一:(了解)##defget_authors(self,book):###拿到这本书的所有作者##aus=book.authors.all()###拼出一个列表,列表中套字典,每个字典是一个作者##li=[]##foriinaus:##li.append({'name':i.name,'age':i.age})##returnli##-----------分割线------不用for循环也可以拿到作者信息--------------------##方式二:(推荐)##方法内部可以继续用其他的序列化类#defget_authors(self,book):#aus=book.authors.all()##可以继续用序列化类,来处理#auth_ser=AuthorSerializer(aus,many=True)#returnauth_ser.data#方式三:(主推荐)#需要把以上代码全部都注释掉方可使用下面的方式。#classAuthorSerializer(serializers.Serializer):#nid=serializers.CharField()#name=serializers.CharField()#age=serializers.CharField()###fromapp01.modelsimportBook###classBookSerializer(serializers.ModelSerializer):##必须写一个内部类,名字必须叫Meta#classMeta:##这样就可以拿到Book表中的所有信息了#model=Book#fields='__all__'##重写属性,可以显示出publish的具体内容,不写的话,只是会显示publish的ID##publish=serializers.CharField(source='publish.name')#authors=serializers.SerializerMethodField()##defget_authors(self,book):#aus=book.authors.all()#auth_ser=AuthorSerializer(aus,many=True)#returnauth_ser.data#方式四:需要把以上代码全部都注释掉方可使用下面的方式。fromapp01.modelsimportBookclassBookSerializer(serializers.ModelSerializer):classMeta:#这样就可以拿到Book表中的所有信息了model=Book#fields='__all__'#指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3),可控性差,效率低(因为要来回查数据库)#depth=2#-------------分割线----------fields='__all__';depth=2去注释#去掉指定的字段#exclude=['publish','authors']#----------分割线在Meta类中,除了model=Book不注释,其他都需要注释掉方可显示出效果#指定只取这两个字段#注意:exclude与fields不能联用fields=['nid','name']

最后只使用postman 的get 方式来验证即可。不用修改里面配置