zoukankan      html  css  js  c++  java
  • django跨表联查传输数据到前端

    需求:通过一对多的表关联字段,拿到多的一方所有数据,再通过序列化传到前端页面!
    
    
    models.py
    
    
    class Infomation(BaseModel):
        title = models.CharField(max_length=64, verbose_name='资讯标题')
        title_photo = models.ImageField(upload_to='title_photo', verbose_name='资讯封面', max_length=255, null=True, blank=True)
        info_type = models.ForeignKey(to='Info_Type', verbose_name='资讯所属类型', on_delete=models.CASCADE, related_name='info')
    
        # @property
        # def photos(self):
        #     photo_list = self.detail_photo.all()
        #     return [photo_obj.id for photo_obj in photo_list]
        
        class Meta:
            db_table = 'freedom_infomation'
            verbose_name = '资讯'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.title
    
    class Info_photo(BaseModel):
        photo = models.ImageField(upload_to='info_photo', max_length=255, verbose_name='资讯的图片', null=True, blank=True)
        info = models.ForeignKey(to='Infomation', verbose_name='所属的资讯', related_name='detail_photo',
                                 on_delete=models.CASCADE)
        class Meta:
            db_table = 'freedom_info_photo'
            verbose_name = '资讯的图片'
            verbose_name_plural = verbose_name
    
    上述为模型层,Infomation表与Info_photo表是一对多相互关联的!
    
    
    
    views.py
    
    from rest_framework.generics import ListAPIView
    class InformateAPIView(ListAPIView):
        queryset = Infomation.objects.filter(is_show=True, is_delete=False)
        serializer_class = InformationModelSerializer
    
    上述为视图层,可以直接利用drf的封装的方法,完成数据的查询
    
    
    urls.py
    
    path('information/', views.InformateAPIView.as_view()),
    
    上述为路由层
    
    
    
    
    serializer.py      序列化层
    
    class Info_photomodelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Info_photo
            fields = ['photo','id']
    
    
    
    class InformationModelSerializer(serializers.ModelSerializer):
        detail_photo = Info_photomodelSerializer(many=True)
        class Meta:
            model = Infomation
            fields = [ 'title',  'title_photo', 'create_time', 'id','detail_photo' ]
    
    
    
    
    
    处理的方式有两种:
    第一种:在models.py 里   直接在 表 Infomation 下定义一个类方法:
    
     @property
        def photos(self):
            photo_list = self.detail_photo.all()
            # return [(photo_obj.id,photo_obj.photo) for photo_obj in photo_list]  这种不行
            return [photo_obj.id for photo_obj in photo_list]
    
    只要有请求,就会报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
    
    原因是:无法将联表查询的图片格式的数据序列化,可以将其他utf-8格式的数据正常传输!具体的解决方法暂时没有找出!
    
    
    
    第二种:如上的serializer.py
    
    class Info_photomodelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Info_photo
            fields = ['photo','id']
    
    class InformationModelSerializer(serializers.ModelSerializer):
        detail_photo = Info_photomodelSerializer(many=True)
        # 直接将表之间的关联字段拿过来作为一个序列化对象,考虑到时多条数据,因此可以将many设置为True 
       
        class Meta:
            model = Infomation
            fields = [ 'title',  'title_photo', 'create_time', 'id','detail_photo' ]
    这种正常传输所有的数据!
    备注:这种思路要序列化多个表,为什么不间接去拿到所需的数据呢?
    
    解决:利用django的双下划线去做!
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11288821.html
Copyright © 2011-2022 走看看