如何在 Wagtail API v2 中按集合过滤图像

问题描述 投票:0回答:1

我有一个带有集合外键的页面类型:

class PageWithManyPhotos(Page):
    collection = models.ForeignKey("wagtailcore.Collection", ...)

我想通过 API 检索为页面选择的集合的所有图像。理想情况下从页面端点,但从图像端点也可以(它需要一个额外的请求,首先获取集合 id,然后按集合过滤图像)

第一种方法

当我将 APIField 添加到我的页面模型时:

api_fields = [APIField("collection", serializer=CollectionSerializer())]

class CollectionSerializer(ModelSerializer):
    images = ImageSerializer(read_only=True, many=True)

    class Meta:
        model = Collection
        # fields = ["id", "name", "images"]
        exclude = []

并在

/api/v2/pages/?type=base.GalleryPage&fields=collection
提出请求,我收到回复,但没有图像:

 "collection": {
                "id": 8,
                "path": "000100050003",
                "depth": 3,
                "numchild": 0,
                "name": "Collection 1"
            }

我无法得到相反的关系。也许是因为 Collection 是 MP_Node 而不是 models.Model?

第二种方法

我还尝试了第二种方法,在

/api/v2/images/?collection=<collection_id>
端点中添加自定义视图集,并通过图像端点中的集合过滤图像。集合字段不在 default fields 中。我尝试添加它,执行以下操作:

class CollectionField(Field):
    def get_attribute(self, instance):
        return instance

    def to_representation(self, image):
        return image.collection_id


class CustomImageSerializer(BaseSerializer):
    collection = CollectionField(read_only=True)


class CustomImagesAPIViewSet(ImagesAPIViewSet):
    meta_fields = BaseAPIViewSet.meta_fields + ["collection"]
    base_serializer_class = CustomImageSerializer


api_router.register_endpoint("images", CustomImagesAPIViewSet)

django django-rest-framework wagtail wagtail-apiv2
1个回答
0
投票

从你的帖子中我不清楚你的第二种方法是否能给你你想要的输出。

您的第一种方法不起作用,因为集合和图像之间的关系是用

related_name="+"
定义的,这意味着您可以说
my_collection.images.all()
。我认为如果您使用 SerializerMethodField 定义图像字段,然后让
get_images
函数返回带有 collection_id =

的所有图像,您仍然可以执行此操作
© www.soinside.com 2019 - 2024. All rights reserved.