You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django RestFramework如何返回一对多关联的所有图片URL列表

实现方案

只需两步修改即可满足需求:

1. 修改序列化器代码

替换原有的单张图片URL字段,改用SerializerMethodField遍历所有关联图片生成URL列表,修改后的Serializer.py代码如下:

class BicicletasSerializer(serializers.ModelSerializer):
    marca__nome = serializers.CharField(source='marca.nome')
    categoria = serializers.CharField(source='categoria.nome')
    terrenos = serializers.StringRelatedField(many=True)
    absolute_url = serializers.URLField(source='get_absolute_url', read_only=True)
    # 替换原单图字段,改为动态生成列表的SerializerMethodField
    img_url = serializers.SerializerMethodField(read_only=True)

    def get_img_url(self, obj):
        # 遍历所有关联的自行车图片,返回URL列表
        return [item.image.url for item in obj.imagembicleta_set.all()]

    class Meta:
        model = Bicicleta
        fields = ['id', 'nome', 'marca__nome', 'categoria', 'atividades', 'terrenos', 'preco', 'ano', 'absolute_url', 'img_url']

2. 优化查询性能(可选但强烈建议)

为了避免出现N+1查询问题,在视图中预加载关联的图片数据,修改后的views.py代码如下:

class BicicletasView(generics.ListAPIView):
    serializer_class = BicicletasSerializer
    # 增加prefetch_related预加载关联图片数据,减少数据库查询次数
    queryset = Bicicleta.objects.all().prefetch_related('imagembicleta_set')
    filter_backends = (DjangoFilterBackend, SearchFilter)
    filterset_fields = ['marca', 'terrenos', 'status']
    search_fields = {'nome': ['icontains'], }

修改完成后接口返回的img_url字段就会是包含所有关联图片URL的数组,产品没有关联图片时会自动返回空数组。

内容的提问来源于stack exchange,提问作者leozaneti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:45:08