models Package

Data models and type definitions for the Dataverse SDK.

Provides dataclasses and helpers for Dataverse entities:

Modules

batch

Public result types for batch operations.

fetchxml_query

FetchXmlQuery — inert query object returned by QueryOperations.fetchxml().

filters

Composable OData filter expressions for the Dataverse SDK.

Provides an expression tree that compiles to OData $filter strings, with Python operator overloads (&, |, ~) for composing complex filter conditions.

Example::

from PowerPlatform.Dataverse.models.filters import col, raw


# Preferred GA idiom — col() proxy
expr = col("statecode") == 0
print(expr.to_odata())  # statecode eq 0


# Complex composition with OR and AND
expr = (col("statecode") == 0) | (col("statecode") == 1) & (col("revenue") > 100000)
print(expr.to_odata())


# In / not-in
expr = col("statecode").in_([0, 1, 2])
print(expr.to_odata())
# Microsoft.Dynamics.CRM.In(PropertyName='statecode',PropertyValues=["0","1","2"])


# Raw OData escape hatch (no deprecation warning)
expr = raw("Microsoft.Dynamics.CRM.Today(PropertyName='createdon')")


# Negation
expr = ~(col("statecode") == 1)
print(expr.to_odata())  # not (statecode eq 1)
labels

Label models for Dataverse metadata.

protocol

DataverseModel structural Protocol for typed entity integration.

query_builder

Fluent query builder for constructing OData queries.

Provides a type-safe, discoverable interface for building complex queries against Dataverse tables with method chaining.

Example::

# Via client (recommended) -- flat iteration over records
from PowerPlatform.Dataverse.models import col


for record in (client.query.builder("account")
               .select("name", "revenue")
               .where(col("statecode") == 0)
               .where(col("revenue") > 1_000_000)
               .order_by("revenue", descending=True)
               .top(100)
               .execute()):
    print(record["name"])


# With composable expression tree
from PowerPlatform.Dataverse.models import col, raw


for record in (client.query.builder("account")
               .select("name", "revenue")
               .where((col("statecode") == 0) | (col("statecode") == 1))
               .where(col("revenue") > 100000)
               .top(100)
               .execute()):
    print(record["name"])


# Lazy paged iteration (one QueryResult per HTTP page)
for page in (client.query.builder("account")
             .select("name")
             .execute_pages()):
    process_batch(page)


# Get results as a pandas DataFrame
df = (client.query.builder("account")
      .select("name", "telephone1")
      .where(col("statecode") == 0)
      .top(100)
      .execute()
      .to_dataframe())
record

Record models for Dataverse data.

relationship

Relationship models for Dataverse (input and output).

table_info

Table and column metadata models for Dataverse.

upsert

Upsert data models for the Dataverse SDK.

Classes

AlternateKeyInfo

Alternate key metadata for a Dataverse table.

BatchItemResponse

Response from a single operation within a batch request.

Responses are returned in submission order. For operations added to a changeset, responses appear in the changeset's position in that order.

Example:


   for item in result.responses:
       if item.is_success:
           print(f"[OK] {item.status_code} entity_id={item.entity_id}")
       else:
           print(f"[ERR] {item.status_code}: {item.error_message}")
BatchResult

Result of executing a batch request.

Contains one BatchItemResponse per HTTP operation submitted. Operations that expand to multiple HTTP requests (e.g. add_columns with three columns) contribute three entries.

Example:


   result = client.batch.new().execute()
   print(f"Succeeded: {len(result.succeeded)}, Failed: {len(result.failed)}")
   for guid in result.entity_ids:
       print(f"[OK] entity_id: {guid}")
CascadeConfiguration

Defines cascade behavior for relationship operations.

Valid values for each parameter:

  • "Cascade": Perform the operation on all related records

  • "NoCascade": Do not perform the operation on related records

  • "RemoveLink": Remove the relationship link but keep the records

  • "Restrict": Prevent the operation if related records exist

ColumnInfo

Column metadata from a Dataverse table definition.

ColumnProxy

Fluent proxy for building OData filter expressions from a column name.

Returned by col. Operator overloads and methods produce FilterExpression instances that can be passed to QueryBuilder.where().

Example:


   from PowerPlatform.Dataverse.models.filters import col

   expr = col("statecode") == 0               # equality
   expr = col("revenue") > 1_000_000          # comparison
   expr = col("name").like("Contoso%")        # startswith
   expr = col("name").is_null()               # null check
   expr = col("statecode").in_([0, 1])        # in
DataverseModel

Structural Protocol enabling typed entity instances to be passed to records.create() and records.update().

Implement this Protocol on any entity class (dataclass, Pydantic model, hand-rolled) to enable it to be passed directly to CRUD operations without specifying the table name or converting to dict manually.

Required class variables:

  • __entity_logical_name__ — Dataverse logical entity name (e.g. "account")

  • __entity_set_name__ — OData entity set name (e.g. "accounts")

Required instance methods:

  • to_dict() — return record payload as dict

  • from_dict(data) — classmethod to reconstruct from a response dict

Example:


   from dataclasses import dataclass
   from PowerPlatform.Dataverse import DataverseModel

   @dataclass
   class Account:
       __entity_logical_name__ = "account"
       __entity_set_name__ = "accounts"
       name: str = ""
       telephone1: str = ""

       def to_dict(self) -> dict:
           return {"name": self.name, "telephone1": self.telephone1}

       @classmethod
       def from_dict(cls, data: dict) -> "Account":
           return cls(
               name=data.get("name", ""),
               telephone1=data.get("telephone1", ""),
           )

   # isinstance() works today — Protocol is runtime_checkable:
   assert isinstance(Account(), DataverseModel)

   # Type your own helpers against the Protocol now:
   def save(entity: DataverseModel) -> None:
       data = entity.to_dict()
       client.records.create(entity.__entity_logical_name__, data)

Note

Direct dispatch (client.records.create(entity) without a table name

or dict) is not yet supported and will be added in a future release.

ExpandOption

Structured options for an $expand navigation property.

Allows specifying nested $select, $filter, $orderby, and $top options for a single navigation property expansion, following the OData $expand syntax.

Example:


   # Expand Account_Tasks with nested options
   opt = (ExpandOption("Account_Tasks")
          .select("subject", "createdon")
          .filter("contains(subject,'Task')")
          .order_by("createdon", descending=True)
          .top(5))

   query = (client.query.builder("account")
            .select("name")
            .expand(opt)
            .execute())
FetchXmlQuery

Inert FetchXML query object. No HTTP request is made until execute or execute_pages is called.

Obtained via client.query.fetchxml(xml).

FilterExpression

Base class for composable OData filter expressions.

Supports Python operator overloads for logical composition:

  • expr1 & expr2 produces (expr1 and expr2)

  • expr1 | expr2 produces (expr1 or expr2)

  • ~expr produces not (expr)

Label

Represents a label that can have multiple localized versions.

LocalizedLabel

Represents a localized label with a language code.

LookupAttributeMetadata

Metadata for a lookup attribute.

Valid required_level values:

  • "None": The attribute is optional

  • "Recommended": The attribute is recommended

  • "ApplicationRequired": The attribute is required

ManyToManyRelationshipMetadata

Metadata for a many-to-many entity relationship.

OneToManyRelationshipMetadata

Metadata for a one-to-many entity relationship.

QueryBuilder

Fluent interface for building and executing OData queries against a sync client.

Provides method chaining for constructing complex queries with composable filter expressions. Can be used standalone (via build()) or bound to a client (via execute).

QueryParams

Typed dictionary returned by QueryBuilder.build().

Provides IDE autocomplete when passing build results to client.records.list() manually.

QueryResult

Iterable wrapper around a list of Record objects.

Returned by execute (flat mode) and list.

Backward-compatible: for r in result continues to work without change.

RelationshipInfo

Typed return model for relationship metadata.

Returned by create_one_to_many_relationship, create_many_to_many_relationship, get_relationship, and create_lookup_field.

Example:


   result = client.tables.create_one_to_many_relationship(lookup, relationship)
   print(result.relationship_schema_name)
   print(result.lookup_schema_name)
TableInfo

Table metadata with dict-like backward compatibility.

Supports both new attribute access (info.schema_name) and legacy dict-key access (info["table_schema_name"]) for backward compatibility with code written against the raw dict API.

Example:


   info = client.tables.create("new_Product", {"new_Price": "decimal"})
   print(info.schema_name)              # new attribute access
   print(info["table_schema_name"])     # legacy dict-key access
UpsertItem

Represents a single upsert operation targeting a record by its alternate key.

Used with upsert to upsert one or more records identified by alternate keys rather than primary GUIDs.

Example:


   item = UpsertItem(
       alternate_key={"accountnumber": "ACC-001", "address1_postalcode": "98052"},
       record={"name": "Contoso Ltd", "telephone1": "555-0100"},
   )

Functions

col

Return a ColumnProxy for building filter expressions.

This is the preferred GA idiom for constructing filter expressions:


   from PowerPlatform.Dataverse.models.filters import col

   expr = col("statecode") == 0
   expr = col("revenue") > 1_000_000
   expr = col("name").like("Contoso%")
   expr = col("statecode").in_([0, 1])
   expr = col("parentaccountid").is_null()
col(name: str) -> ColumnProxy

Parameters

Name Description
name
Required

Column logical name (case-insensitive, will be lowercased).

Returns

Type Description

A ColumnProxy bound to the column.

Exceptions

Type Description

If name is empty.

raw

Verbatim OData filter expression (passed through unchanged).

This function is not deprecated — it is the OData escape hatch with no typed replacement.

Example:


   raw("Microsoft.Dynamics.CRM.Today(PropertyName='createdon')")
raw(filter_string: str) -> FilterExpression

Parameters

Name Description
filter_string
Required

Raw OData filter string.

Returns

Type Description

A FilterExpression.