Feature Request: Support OData Deep Inserts in create() and upsert()
@sagebree y travaille déjà.
Depuis le 21/4/2026.
Évaluation
Cette issue n'a pas encore été évaluée.
Description
Summary
Add support for OData deep inserts in client.records.create() and client.records.upsert(), allowing parent and related child records to be created/upserted in a single API call.
Motivation
When importing data that involves a parent record and its related child records (e.g. via one-to-many relationships), the current SDK requires separate API calls for each table — first creating the parent, then creating each child record individually with a foreign key reference back to the parent. This is both verbose and inefficient, especially for bulk import scenarios.
The Dataverse Web API already natively supports deep inserts, where related records can be nested inside the parent payload using navigation property names. For example:
{
"name": "Sample Account",
"primarycontactid": {
"firstname": "John",
"lastname": "Smith"
},
"contact_customer_accounts": [
{ "firstname": "Jane", "lastname": "Doe" },
{ "firstname": "Bob", "lastname": "Jones" }
]
}
The SDK does not currently surface this capability. Attempting to pass nested dicts/lists in the record payload will not work correctly because _create() lowercases all keys via _lowercase_keys(), which breaks case-sensitive navigation property names.
Proposed Behavior
Allow create() and upsert() to accept nested dicts (for single-valued navigation properties) and lists of dicts (for collection-valued navigation properties) within the record payload. Navigation property keys should be preserved as-is (case-sensitive) and not lowercased.
Example usage:
# Deep insert: create parent + children in one call
client.records.create("account", {
"name": "Contoso Ltd",
"primarycontactid": {
"firstname": "John",
"lastname": "Smith"
},
"contact_customer_accounts": [
{"firstname": "Jane", "lastname": "Doe"},
{"firstname": "Bob", "lastname": "Jones"},
]
})
Current Workaround
Create parent and child records in separate calls, manually managing the foreign key references:
parent_id = client.records.create("account", {"name": "Contoso Ltd"})
client.records.create("contact", {
"firstname": "Jane",
"lastname": "Doe",
"[email protected]": f"/accounts({parent_id})"
})
Additional Context
- The Dataverse Web API documentation confirms deep insert support for both
POST(create) andPATCH(upsert) operations. - The
_lowercase_keys()call in_create()would need to distinguish between column names (which should be lowercased) and navigation property names (which are case-sensitive and should be preserved). CreateMultiple/UpsertMultiplebulk operations may also benefit from this, depending on API support for deep inserts in batch payloads.
- Langage dominant
- Python
- Étoiles
- 61
- Forks
- 25
- Merge moyen
- 13 h 53 min
- PR mergées (30 j)
- 3
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microsoft/PowerPlatform-DataverseClient-Python
-
enhancement
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
-
enhancement
Difficulté 4/5 3-5 jours Accessibilité débutants 68/100
-
enhancement
Difficulté 3/5 1-2 jours Accessibilité débutants 72/100
-
bug
microsoft/PowerPlatform-DataverseClient-Python#194 · 1 personne assignée ·
-
client.dataframe.get() only returns physical columns, not the full logical schemaPeut-être à nouveau libre @sagebree l’a pris il y a 151 jours, et aucune pull request n’est ouverte. Ouverte
microsoft/PowerPlatform-DataverseClient-Python#170 · 1 personne assignée ·
Toutes les issues de microsoft/PowerPlatform-DataverseClient-Python
Issues similaires
-
Improve Task Cache Windows Registry events to carry the task subkey's last written time and key pathOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
log2timeline/plaso#5299 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
deployment release-lag
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
nolte/kamerplanter#2047 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
ClanGenOfficial/clangen#6216 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
API bug connectors
Difficulté 2/5 1-3 heures Accessibilité débutants 92/100
pyinfra-dev/pyinfra#1986 ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
521xueweihan/HelloGitHub#3847 ·