day83

今日内容

rest_framework序列化

首先序列化需要对写一个类继承serializers.Serializer

方式一:在models的publish写一个__str__方法返回出版社名字

publish = serializers.CharField()

方式二:可以用source指定一个models中的方法

publish = serializers.CharField(source='publish.test')

方式三:直接用publish.他的字段名

publish = serializers.CharField(source='publish.name')
'''
class author_serializers(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.CharField()


class Books_serializers(serializers.Serializer):
    xxx = serializers.CharField(source='name')
    yyy = serializers.CharField(source='price')
    # 方式一:在models的publish写一个__str__方法返回出版社名字
    # publish = serializers.CharField()
    # 方式二: 可以用source指定一个models中的方法
    # publish = serializers.CharField(source='publish.test')
    # 方式三:直接用publish.他的字段名
    # publish = serializers.CharField(source='publish.name')
    # SerializerMethodField可以指定一个方法,该方法需要时get_该字段名

    publish = serializers.SerializerMethodField()
    def get_publish(self, obj):
        dic = {'name': obj.publish.name, 'price': obj.publish.email}
        return dic

    # 可以继续使用序列化
    authors = serializers.SerializerMethodField()

    # def get_authors(self, obj):
        author = obj.authors.all()
        pub = author_serializers(author, many=True)
        return pub.data
'''


class author_serializers(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.CharField()



class Books_serializers(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        # 查询所有字段
        # fields = '__all__'
        # 查询列表中的字段
        fields = ['nid','name']
        # 除了这几个字段不要,查询其余字段
        # exclude = ['publish', 'authors']
        # 指定查询深度
        # depth = 1
    # publish = serializers.CharField(source='publish.name')
    # authors = serializers.SerializerMethodField()
    # def get_authors(self, obj):
    #     authors = obj.authors.all()
    #     Authors = author_serializers(authors, many=True)
    #     return Authors.data
View Code

视图函数:

class Books(APIView):
    def get(self, request):
        db_books = models.Book.objects.all()
        BOOKS = books(db_books, many=True)
        return JsonResponse(BOOKS.data, safe=False)

    def delete(self, request):
        id = request.query_params.get('id')
        models.Book.objects.filter(pk=id).delete()
        dic = {'status': 100, 'msg': '删除成功'}
        return JsonResponse(dic)

    def put(self, request):
        id = request.query_params.get('id')
        name = request.data.get('name')
        price = request.data.get('price')
        models.Book.objects.filter(pk=id).update(name=name, price=price)
        dic = {'status': 100, 'msg': '修改成功'}
        return JsonResponse(dic, safe=False)

    def post(self, request):
        p_name = request.data.get('name')
        p_price = request.data.get('price')
        p_publish = request.data.get('publish')
        p_authors = request.data.get('authors')
        book = models.Book.objects.create(name=p_name, price=p_price, publish_id=p_publish)
        p_authors = p_authors.split(',')
        for p_author in p_authors:
            author = models.Author.objects.filter(pk=p_author).first()
            print(author)
            book.authors.add(author)
        print(book)
        ret = books(book, many=False)
        return JsonResponse(ret.data, safe=False)
View Code

 

HyperlinkedIdentityField(用的很少)

    -1 publish = serializers.HyperlinkedIdentityField(view_name='ttt',lookup_field='publish_id',lookup_url_kwarg='pky')
    -2 view_name:路由的别名,lookup_field:根据表的哪个字段,来拼路径,lookup_url_kwarg:反向解析有名分组的名字
    -3 写路由:url(r'^publish/(?P<pky>\d+)', views.Publish.as_view(),name='ttt'),
    -4 实例化序列化类的时候,需要把request对象传过去
       book_ser=BookSerializer(ret,many=True,context={'request': request})

设置:
class book_serializers(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'

    url = serializers.HyperlinkedIdentityField(source='name', view_name='book', lookup_field='nid',
                                               lookup_url_kwarg='pk')
    # 该设置与form校验类似,都可设置一些参数(max_length,error_messages)
    name = serializers.CharField(max_length=20, error_messages={'required': '必填', 'max_length': '太长'})
    authors = serializers.CharField(required=False)
视图函数使用:
class BOOK(APIView):
    def get(self, request, *args, **kwargs):
        books = models.Book.objects.all()
        bs = SER.book_serializers(books, many=True, context={'request': request})
        return JsonResponse(bs.data, safe=False)

序列化组件的数据校验

      -类比forms组件
      -字段是否必填,通过required,来控制 authors=serializers.CharField(required=False)
      -数据校验,生成一个序列化类的对象
         -对象.is_valid()
      -新增数据:
         -对象.save()
      -修改数据:
         -在生成对象的时候,需要传instanse=查询出来的对象
         -对象.save()

视图函数中使用:

设置时:

 

校验中的局部、全局钩子

    def validate_name(self, value):
        user = models.UserInfo.objects.filter(name=value).first()
        if user:
            raise ValidationError('用户名存在')
        else:
            return value

    def validate(self, attrs):
        name = attrs.get('name')
        pwd = attrs.get('pwd')
        if name and pwd:
            if name == pwd:
                raise ValidationError('用户密码不能相同')
            else:
                return attrs
        return attrs

 

转载于:https://www.cnblogs.com/yaoxiaofeng/p/10111154.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:Module not found: Error: Can't resolve '../views/AboutView.vue' in 'C:\Users\24210\Desktop\houtai\src\router'。引用\[2\]:ERROR in ./src/router/index.js 35:11-37:29 Module not found: Error: Can't resolve '../views/AboutView.vue' in 'C:\Users\24210\Desktop\houtai\src\router' @ ./src/main.js 37:0-30 52:10-16。引用\[3\]: 解决方法很简单 把 ./ 改成 …/ import Vue from 'vue' import Router from 'vue-router' import Login from '../components/Login.vue' Vue.use(Router) export default new Router({ routes: \[ { path: '/login', component: Login } \] })。 问题:Module not found: Error: Can't resolve '../views/Home.vue' in 'E:\idea-workspace\day83_phone-store_vantui+vue\phone_store\src\router' 回答: 根据提供的引用内容,出现了一个模块找不到的错误,具体是在路径'E:\idea-workspace\day83_phone-store_vantui+vue\phone_store\src\router'中找不到'../views/Home.vue'模块。这个错误可能是由于路径配置不正确或者文件确实不存在导致的。为了解决这个问题,你可以尝试修改路径配置,将'./'改为'../',或者确保'../views/Home.vue'文件存在于指定路径中。如果你使用的是Vue框架,你还可以检查路由配置文件中是否正确引入了'../views/Home.vue'组件。希望这些解决方法能帮到你。 #### 引用[.reference_title] - *1* *2* [Module not found: Error: Can‘t resolve ‘../views/AboutView.vue‘ in ‘C:\Users\24210\Desktop\hout](https://blog.csdn.net/shsh546/article/details/125003193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vue初学碰到Module not found: Error: Can‘t resolve ‘./components/Login.vue‘ in](https://blog.csdn.net/qq_41309350/article/details/123028024)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值