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
相关产品推荐
相关产品推荐

