我有一个带有集合外键的页面类型:
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)
从你的帖子中我不清楚你的第二种方法是否能给你你想要的输出。
您的第一种方法不起作用,因为集合和图像之间的关系是用
related_name="+"
定义的,这意味着您可以说 my_collection.images.all()
。我认为如果您使用 SerializerMethodField 定义图像字段,然后让 get_images
函数返回带有 collection_id =