Field Mapping
When your MongoDB documents use different field names than your Pydantic model,
field_mapping translates between them transparently.
Use cases
Legacy databases with non-standard key names
Gradual schema migration (old keys in DB, new names in code)
MongoDB conventions (
product_sku) vs Python conventions (sku)
Configuration
class ProductAdmin(ModelAdmin):
field_mapping = {
"sku": "product_sku", # model field → DB key
"cost_price": "unit_cost",
}
The mapping is model field name → MongoDB key.
What gets translated
Read operations
Documents fetched from MongoDB are translated to model field names before display in changelists and forms.
Write operations
Form data validated through Pydantic uses model field names, then translated to database keys before insert/update.
Queries
Search, filters, ordering, and date hierarchy queries are translated to use database field names.
List filters
Filter queryset() fragments are automatically remapped.
Example
Pydantic model:
class Product(BaseModel):
sku: str
cost_price: float
MongoDB document:
{
"_id": "...",
"product_sku": "WIDGET-001",
"unit_cost": 12.50,
"name": "Widget"
}
Admin display: The changelist and forms show sku and cost_price with
values from product_sku and unit_cost.
Manual inserts: When inserting documents directly into MongoDB, use the
database key names (product_sku, not sku).
Implementation
Translation functions live in fastapi_mongo_admin.services.mapping:
translate_to_db, translate_from_db, and translate_query. Reverse
mapping for reads is built automatically from the forward mapping.
See API Reference for function signatures.
Troubleshooting
Field shows empty after manual DB insert
You inserted using the model field name instead of the mapped database key.
Either use mapped keys in MongoDB or remove field_mapping.
Filter returns no results
Ensure filter values match the data type stored in MongoDB. Field mapping handles key translation but not value transformation.
Search does not find documents
search_fields use model field names; the repository translates them to
database keys before querying.