Customize data model identifiers
Identifiers are defined using the .identifier()
method on a model definition. Usage of the .identifier()
method is optional; when it's not present, the model will automatically have a field called id
of type ID
that is automatically generated unless manually specified.
const schema = a.schema({ Todo: a.model({ content: a.string(), completed: a.boolean(), }) .authorization(allow => [allow.publicApiKey()]),});
let todo = Todo( content: "Buy Milk", completed: false)let createdTodo = try await Amplify.API.mutate(request: .create(todo)).get()print("New Todo created: \(createdTodo)")
If you want, you can use Amplify Data to define single-field and composite identifiers:
- Single-field identifier with a consumer-provided value (type:
id
orstring
, and must be markedrequired
) - Composite identifier with a set of consumer-provided values (type:
id
orstring
, and must be markedrequired
)
Single-field identifier
If the default id
identifier field needs to be customized, you can do so by passing the name of another field.
const schema = a.schema({ Todo: a.model({ todoId: a.id().required(), content: a.string(), completed: a.boolean(), }) .identifier(['todoId']) .authorization(allow => [allow.publicApiKey()]),});
let todo = Todo( todoId: "MyUniqueTodoId", content: "Buy Milk", completed: false)let createdTodo = try await Amplify.API.mutate(request: .create(todo)).get()print("New Todo created: \(createdTodo)")
Composite identifier
For cases where items are uniquely identified by more than a single field, you can pass an array of the field names to the identifier()
function:
const schema = a.schema({ StoreBranch: a.model({ geoId: a.id().required(), name: a.string().required(), country: a.string(), state: a.string(), city: a.string(), zipCode: a.string(), streetAddress: a.string(), }).identifier(['geoId', 'name']) .authorization(allow => [allow.publicApiKey()]),});
let queriedStoreBranch = try await Amplify.API.query( request: .get( StoreBranch.self, byIdentifier: .identifier( geoId: "123", name: "Downtown")))