zoukankan      html  css  js  c++  java
  • django book demo

    class Author(models.Model):
        name = models.CharField(max_length=20, help_text='作者名')
        sex = models.IntegerField(choices=[(0, '男'), (1, '女')], null=False, default=0)
        phone_number = models.BigIntegerField(null=False)
    
        class Meta:
            db_table = "tbl_author"
            verbose_name = '作者信息表'
            unique_together = ['name', 'phone_number']
    
    
    class Publish(models.Model):
        publish_name = models.CharField(max_length=30, null=False)
        address = models.CharField(max_length=50, null=False)
    
        class Meta:
            db_table = "tbl_publish"
            verbose_name = '出版社信息表'
            ordering = ["id"]
    
    
    # class VueModel(models.Model):
    #     name = models.CharField(max_length=50)
    #     age = models.IntegerField()
    #     address = models.CharField(max_length=100)
    # 
    #     class Meta:
    #         db_table = "tbl_vue"
    #         verbose_name = 'vue信息表'
    
    
    class Book(models.Model):
        name = models.CharField(max_length=20, null=False)
        price = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
        author = models.ManyToManyField(to=Author, related_name='authors',
                                        through='BookRelatedAuthor', through_fields=['book', 'author'])
        publish = models.ForeignKey(to=Publish, related_name='publisher', db_constraint=False, on_delete=models.DO_NOTHING)
    
        class Meta:
            db_table = "tbl_book"
            verbose_name = '书籍信息表'
    
    
    class BookRelatedAuthor(models.Model):
        book = models.ForeignKey(to=Book, on_delete=models.DO_NOTHING, db_constraint=False)
        author = models.ForeignKey(to=Author, on_delete=models.DO_NOTHING, db_constraint=False)
        remark = models.CharField(null=False, max_length=50)
    
        class Meta:
            db_table = "tbl_book_related_author"
            verbose_name = '书籍信息表'
    

      

    class SerializerBook(serializers.ModelSerializer):
        publish_name = serializers.SerializerMethodField()
    
        # author_info = serializers.SerializerMethodField()
    
        class Meta:
            model = Book
            fields = ['id', 'name', 'price', 'author', 'publish', 'publish_name', 'author']  # 'author_info'
    
            extra_kwargs = {
                # 'author': {'write_only': True},
                'publish': {'write_only': True}
            }
    
        # 语法格式 get_SerializerMethodField序列化字段名
        def get_publish_name(self, book):
            publish_name = book.publish.publish_name
            return publish_name
    
        # def get_author_info(self, book):
        #     """ 可自定义返回字段"""
        #     #     # res=[{"name":author.name,"id":author.id,"sex":author.sex} for author in book.author.all()]
        #     serial = SerializerAuthor(instance=book.author.all(), many=True)
        #     return serial.data
    
    
    class SerializerAuthor(serializers.ModelSerializer):
        # todo 语法格式 get_字段_display
        sex_name = serializers.CharField(source='get_sex_display', read_only=True, )
        name = serializers.CharField()
    
        class Meta:
            model = Author
            fields = ['id', 'name', 'phone_number', 'sex', 'sex_name']
            extra_kwargs = {
                'sex': {'write_only': True}
            }
    
        # validate_字段名
        def validate_phone_number(self, phone_number):
            if not re.match(r'^1[35678]d{9}$', str(phone_number)):
                raise ValidationError({"phone_number": '名字必须合法手机号'})
            return phone_number
        # def validate(self, attrs):
        #     """ 全局验证,attrs ->dict"""
        #     pass
    
    
    class SerializerPublish(serializers.ModelSerializer):
        class Meta:
            model = Publish
            fields = "__all__"
    

      

    views.py

    # class BookView(APIView):
    #
    #     def get(self, request, *args, **kwargs):
    #         print(request.version,'xxxxxxxxxxx')
    #         inst=Book.objects.filter().all()
    #         serial=SerializerBook(instance=inst,many=True)
    #         data=serial.data
    #         return Response(data=data,status=200)
    #
    #     def post(self, request, *args, **kwargs):
    #         serial=SerializerBook(data=request.data,many=False)
    #         if serial.is_valid(raise_exception=True):
    #             serial.save()
    #             data=serial.data
    #         else:
    #             data=serial.errors
    #         return Response(data=data,status=200)
    
    #
    
    
    class BookView(CustomViewSet):
        """ 视图简化案例"""
        # 自定义过滤
        # def get_queryset(self):
        #     """
        #     Optionally restricts the returned purchases to a given user,
        #     by filtering against a `username` query parameter in the URL.
        #     """
        #     queryset = Book.objects.all().order_by('price')
        #     author = self.request.query_params.get('author_name', None)
        #     if author is not None:
        #         queryset = queryset.filter(author__name=author)
        #     return queryset
        # authentication_classes = [CustomerAuthentication]
        # permission_classes = [IsOwnerCheck]
        versioning_class = URLPathVersioning  # 局部配置版本
        lookup_field = 'id'
        parser_classes = [JSONParser, FormParser]
        filter_backends = [DjangoFilterBackend, filters.OrderingFilter]  # filters.SearchFilter
        filterset_fields = ['name']
        ordering_fields = ['price']
        # search_fields = ['author__name']
        # todo keep pagination consistent with ordering fields
        queryset = Book.objects.all().order_by(*ordering_fields)
        # queryset = get_queryset
        serializer_class = SerializerBook
    
    
    class AuhthorView(CustomViewSet):
        filter_backends = [filters.OrderingFilter]
        ordering_fields = ['id']
        parser_classes = [JSONParser, FormParser]
        serializer_class = SerializerAuthor
        queryset = Author.objects.all().order_by(*ordering_fields)

    class PublsihView(CustomViewSet):
    parser_classes = [JSONParser, FormParser]
    serializer_class = SerializerPublish
    queryset = Publish.objects.all()


    class VueView(CustomViewSet):
    lookup_field = 'id'
    parser_classes = [JSONParser, FormParser]
    serializer_class = SerializerVue
    queryset = VueModel.objects.all()

    @method_decorator(csrf_exempt, name='dispatch')
    class HomeIndex(APIView):

    def dispatch(self, request, *args, **kwargs):
    #
    self.headers = self.default_response_headers
    request = self.initialize_request(request, *args, **kwargs)
    # self.request=request
    foo = getattr(self, request.method.lower(), self.http_method_not_allowed)
    f = foo(request, *args, **kwargs)

    self.response = self.finalize_response(request, f, *args, **kwargs)
    # 先找自己的类找不到再去父类

    return f

    # todo for View and HttpResponse
    # return super().dispatch(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
    inst = MyModel.objects.all()
    ser = TestSerailizer(instance=inst, many=True)

    return Response(data=ser.data)

    def post(self, request, *args, **kwargs):
    serial = TestSerailizer(data=request.data)
    if serial.is_valid():
    serial.save()
    return Response(data=serial.data)
    else:
    return Response(data=serial.errors)

      

  • 相关阅读:
    .net 实现 URL重写,伪静态
    jquery上传插件AjaxUpload使用示例
    事实上
    C# DataSet和DataTable详解
    当你累了,准备放弃时,看看这个吧!!!
    asp.net页面数据传递总结
    在Global.asax中根据请求路径判断是否可以访问。。。我没思路只好这样了
    今儿改的
    C 语言利用数组实现大数计算
    开始学习 类
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/14877804.html
Copyright © 2011-2022 走看看