Django使用prefech

Django使用prefech,第1张

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
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存