栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django使用prefech

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django使用prefech

Django使用prefech_related结合rest_framework的serializers实现序列化嵌套
  • 前言
    • Models
    • Serializers
    • Views
    • 数据库
    • 结果

前言

由于没有使用Django的templates,而仅仅是将Django作为后端,因此使用rest_framework来实现resful风格的API,在开发过程中将place作为image的外键,希望达到的目标是在获取所有place信息的同时,获取它相关的image,通过image中的Foreignkey即place_id反向获取多个image对象。通过不断探索,终于是实现了这个效果。现在看来这个实现过程非常简单,只是苦于之前缺少相关知识,久久无法实现,特此记录,希望能帮到有需要的人。

Models
#地点类
class Place(models.Model):
    id = models.CharField(max_length=32, primary_key=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    
#图片类
class PlaceImage(models.Model):
    id = models.CharField(max_length=32, primary_key=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    place = models.ForeignKey(Place, on_delete=models.CASCADE, related_name='place_image')
    
Serializers
class PlaceImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlaceImage
        fields = ('id', 'name') 
        
class PlaceSerializer(serializers.ModelSerializer):
	#有多张图片, many=True
    place_image = PlaceImageSerializer(many=True)

    class Meta:
        model = Place
        fields = "__all__"      
       
Views
class PlaceViewSet(ModelViewSet):
    serializer_class = PlaceSerializer

    def list(self, request, **kwargs):
        queryset = Place.objects.prefetch_related('place_image')
        serializer = PlaceSerializer(queryset, many=True)
        response = {'code': 0, 'data': serializer.data, 'msg': '', 'total': len(serializer.data)}
        return Response(response)
        
数据库
  • place
  • place_image
结果
{
    "code": 0,
    "data": [
        {
            "id": "1",
            "place_image": [
                {
                    "id": "1",
                    "name": "pic1"
                },
                {
                    "id": "2",
                    "name": "pic2"
                }
            ],
            "name": "School"
        },
        {
            "id": "2",
            "place_image": [
                {
                    "id": "3",
                    "name": "pic3"
                }
            ],
            "name": "Market"
        }
    ],
    "msg": "",
    "total": 2
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号