Skip to main content

文档服务 API:填充字段

¥Document Service API: Populating fields

默认情况下,文档服务 API 不填充任何关系、媒体字段、组件或动态区域。本页介绍如何使用填充参数来 populate 特定字段。

¥By default the Document Service API does not populate any relations, media fields, components, or dynamic zones. This page describes how to use the populate parameter to populate specific fields.

💡 提示

你还可以使用 select 参数仅返回查询结果中的特定字段(请参阅 select 参数 文档)。

¥You can also use the select parameter to return only specific fields with the query results (see the select parameter documentation).

提醒

如果安装了用户和权限插件,则必须为正在填充的内容类型启用 find 权限。如果角色无权访问内容类型,则不会填充该内容类型。

¥If the Users & Permissions plugin is installed, the find permission must be enabled for the content-types that are being populated. If a role doesn't have access to a content-type it will not be populated.

关系和媒体字段

¥Relations and media fields

发布文档的一个或多个语言环境。

¥Queries can accept a populate parameter to explicitly define which fields to populate, with the following syntax option examples.

为所有关系填充 1 级

¥Populate 1 level for all relations

要为所有关系填充一层深度,请将 * 通配符与 populate 参数结合使用:

¥To populate one-level deep for all relations, use the * wildcard in combination with the populate parameter:

Example request


const documents = await strapi.documents("api::article.article").findMany({


populate: "*",
});
Example response
{
[
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
// ...
"headerImage": {
"data": {
"id": 1,
"attributes": {
"name": "17520.jpg",
"alternativeText": "17520.jpg",
"formats": {
// ...
}
// ...
}
}
},
"author": {
// ...
},
"categories": {
// ...
}
}
// ...
]
}

为特定关系填充 1 级

¥Populate 1 level for specific relations

要为特定关系填充一层深度,请将关系名称传递到 populate 数组中:

¥To populate specific relations one-level deep, pass the relation names in a populate array:

Example request


const documents = await strapi.documents("api::article.article").findMany({


populate: ["headerImage"],
});
Example response
[
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
// ...
"headerImage": {
"id": 2,
"name": "17520.jpg"
// ...
}
}
// ...
]

为特定关系填充多个深度级别

¥Populate several levels deep for specific relations

要为特定关系填充多层深度,请将对象格式与 populate 结合使用:

¥To populate specific relations several levels deep, use the object format with populate:

Example request


const documents = await strapi.documents("api::article.article").findMany({


populate: {
categories: {
populate: ["articles"],
},
},
});
Example response
[
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
// ...
"categories": {
"id": 1,
"name": "Test Category",
"slug": "test-category",
"description": "Test 1"
// ...
"articles": [
{
"id": 1,
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
// ...
}
// ...
]
}
}
// ...
]

组件和动态区域

¥Components & Dynamic Zones

组件的填充方式与关系相同:

¥Components are populated the same way as relations:

Example request


const documents = await strapi.documents("api::article.article").findMany({


populate: ["testComp"],
});
Example response
[
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
// ...
"testComp": {
"id": 1,
"name": "Test Component"
// ...
}
}
// ...
]

动态区域本质上是高度动态的内容结构。要填充动态区域,必须使用 on 属性定义每个组件的填充查询。

¥Dynamic zones are highly dynamic content structures by essence. To populate a dynamic zone, you must define per-component populate queries using the on property.

Example request


const documents = await strapi.documents("api::article.article").findMany({


populate: {
testDZ: {
on: {
"test.test-compo": {
fields: ["testString"],
populate: ["testNestedCompo"],
},
},
},
},
});
Example response
[
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
// ...
"testDZ": [
{
"id": 3,
"__component": "test.test-compo",
"testString": "test1",
"testNestedCompo": {
"id": 3,
"testNestedString": "testNested1"
}
}
]
}
// ...
]

使用 create() 填充

¥Populating with create()

要在创建文档时填充:

¥To populate while creating documents:

Example request
strapi.documents("api::article.article").create({
data: {
title: "Test Article",
slug: "test-article",
body: "Test 1",
headerImage: 2,
},
populate: ["headerImage"],
});
Example response
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article",
"slug": "test-article",
"body": "Test 1",
"headerImage": {
"id": 2,
"name": "17520.jpg"
// ...
}
}

使用 update() 填充

¥Populating with update()

要在更新文档时填充:

¥To populate while updating documents:

Example request
strapi.documents("api::article.article").update("cjld2cjxh0000qzrmn831i7rn", {
data: {
title: "Test Article Update",
},
populate: ["headerImage"],
});
Example response
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"title": "Test Article Update",
"slug": "test-article",
"body": "Test 1",
"headerImage": {
"id": 2,
"name": "17520.jpg"
// ...
}
}

使用 publish() 填充

¥Populating with publish()

要在发布文档时填充(与 unpublish()discardDraft() 的行为相同):

¥To populate while publishing documents (same behavior with unpublish() and discardDraft()):

Example request
strapi.documents("api::article.article").publish("cjld2cjxh0000qzrmn831i7rn", {
populate: ["headerImage"],
});
Example response
{
"id": "cjld2cjxh0000qzrmn831i7rn",
"versions": [
{
"id": "cjld2cjxh0001qzrm1q1i7rn",
"locale": "en",
// ...
"headerImage": {
"id": 2,
"name": "17520.jpg"
// ...
}
}
]
}