纵有疾风起
人生不言弃

Django REST framework基础:序列化

 

表结构:

class Article(models.Model):    id = models.AutoField(primary_key=True)    title = models.CharField(max_length=64)    create_time = models.DateField(auto_now=True)    type = models.SmallIntegerField(        choices=((1, '原创'), (2, '转载')),        default=1    )    source = models.ForeignKey(to='Source', on_delete=models.CASCADE)    tag = models.ManyToManyField(to='Tag')class Source(models.Model):    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=32, unique=True, error_messages={"unique": '校区名称不能重复'})class Tag(models.Model):    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=32)class Comment(models.Model):    content = models.CharField(max_length=255)    article = models.ForeignKey(to='Article', on_delete=models.CASCADE)

 

单表的GET和POST:

路由:

url(r'source/', views.SourceView.as_view()),

序列化类:

class SourceSerializer(serializers.ModelSerializer):    def validate_name(self, value):        if '' in value:            raise ValidationError('不符合社会主义核心价值观')        return value    class Meta:        model = models.Source        fields = "__all__"

视图:

class SourceView(APIView):    def get(self, request, *args, **kwargs):        res = {"code": 0}        all_source = models.Source.objects.all()        ser_obj = SourceSerializer(all_source, many=True)        res["data"] = ser_obj.data        return Response(res)    def post(self, request, *args, **kwargs):        res = {"code": 0}        ser_obj = SourceSerializer(data=request.data)        if ser_obj.is_valid():            # 数据没问题            ser_obj.save()            return Response(res)        else:            res["code"] = 1            res["error"] = ser_obj.errors            return Response(res)

 

外键的GET和POST:

路由:

url(r'comment/', views.Comment.as_view()),

 

序列化:

class CommentSerializer(serializers.ModelSerializer):    class Meta:        model = models.Comment        fields = "__all__"        extra_kwargs = {            "content": {"error_messages": {"required": "评论内容不能为空"}},            "article": {"error_messages": {"required": "文章不能为空"}}        }

 

视图:

class Comment(APIView):    def get(self, request, *args, **kwargs):        res = {"code": 0}        all_data = models.Comment.objects.all()        ser_obj = CommentSerializer(all_data, many=True)        res["data"] = ser_obj.data        return Response(res)    def post(self, request, *args, **kwargs):        res = {"code": 0}        ser_obj = CommentSerializer(data=request.data)        if ser_obj.is_valid():            ser_obj.save()        else:            res["code"] = 1            res["error"] = ser_obj.errors        return Response(res)

 

多对多的GET和POST:

路由:

url(r'article/', views.ArticleList.as_view()),

 

序列化:

class TagSerializer(serializers.ModelSerializer):    class Meta:        model = models.Tag        fields = "__all__"class ArticleSerializer(serializers.ModelSerializer):    type = serializers.CharField(source="get_type_display")    tag = TagSerializer(many=True)    class Meta:        model = models.Article        fields = ["id", "title", "type", "source", "tag"]class ArticleWriteSerializer(serializers.ModelSerializer):    class Meta:        model = models.Article        fields = "__all__"        extra_kwargs = {            "tag": {                "error_messages": {                    "does_not_exist": '"{pk_value}"对应的tag对象不存在。'                }            }        }

 

视图:

class ArticleList(APIView):    def get(self, request, *args, **kwargs):        res = {"code": 0}        article_list = models.Article.objects.all()        ser_obj = ArticleSerializer(article_list, many=True)        res["data"] = ser_obj.data        return Response(res)    def post(self, request, *args, **kwargs):        res = {"code": 0}        ser_obj = ArticleWriteSerializer(data=request.data)        if ser_obj.is_valid():            ser_obj.save()        else:            res["code"] = 1            res["error"] = ser_obj.errors        return Response(res)

 


 

超链接的序列化:

路由:

urlpatterns = [    url(r'articlelinked/', views.ArticleLinked.as_view()),,    url(r'source/(?P<pk>\d+)', views.SourceDetailView.as_view(), name='source-detail'),]

 

序列化:

class ArticleHyperlinkedSerializer(serializers.HyperlinkedModelSerializer):    source = serializers.HyperlinkedIdentityField(view_name='source-detail', lookup_field='source_id', lookup_url_kwarg='pk')    class Meta:        model = models.Article        fields = ["id", "type", "title", "source"]        depth = 1

 

视图:

class ArticleLinked(APIView):    def get(self, request, *args, **kwargs):        res = {"code": 0}        article_list = models.Article.objects.all()        ser_obj = ArticleHyperlinkedSerializer(article_list, many=True, context={'request': request})        res["data"] = ser_obj.data        return Response(res)

 

文章转载于:https://www.cnblogs.com/liwenzhou/p/9398627.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » Django REST framework基础:序列化
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录