mirror of
https://github.com/kennethreitz/pydantic.git
synced 2026-06-05 23:00:18 +00:00
db697cc799
* Add exclude/include as field parameters - Add "exclude" / "include" as a field parameter so that it can be configured using model config (or fields) instead of purely at `.dict` / `.json` export time. - Unify merging logic of advanced include/exclude fields - Add tests for merging logic and field/config exclude/include params - Closes #660 * Precompute include/exclude fields for class * Increase test coverage * Remove (now) redundant type checks in Model._iter: New exclusion/inclusion algorithms guarantee that no sets are passed further down. * Add docs for advanced field level exclude/include settings * Minimal optimization for simple exclude/include export Running benchmarks this vs. master is at: this: pydantic best=33.225μs/iter avg=33.940μs/iter stdev=1.120μs/iter version=1.7.3 master: pydantic best=32.901μs/iter avg=33.276μs/iter stdev=0.242μs/iter version=1.7.3 * Apply review comments on exclude/enclude field arguments * Fix/simplify type annotations * Allow both ``True`` and ``Ellipsis`` to be used to indicate full field exclusion * Reenable hypothesis plugin (removed by mistake) * Update advanced include/include docs to use ``True`` instead of ``...`` * Move field info exclude/include updates into FieldInfo class This way, the model field object does not need to concern itself with dealing with field into specific fields. (Same was done for alias in a previous commit). * remove double back tick in markdown. Co-authored-by: Samuel Colvin <samcolvin@gmail.com>
74 lines
1.5 KiB
Python
74 lines
1.5 KiB
Python
import datetime
|
|
from typing import List
|
|
|
|
from pydantic import BaseModel, SecretStr
|
|
|
|
|
|
class Country(BaseModel):
|
|
name: str
|
|
phone_code: int
|
|
|
|
|
|
class Address(BaseModel):
|
|
post_code: int
|
|
country: Country
|
|
|
|
|
|
class CardDetails(BaseModel):
|
|
number: SecretStr
|
|
expires: datetime.date
|
|
|
|
|
|
class Hobby(BaseModel):
|
|
name: str
|
|
info: str
|
|
|
|
|
|
class User(BaseModel):
|
|
first_name: str
|
|
second_name: str
|
|
address: Address
|
|
card_details: CardDetails
|
|
hobbies: List[Hobby]
|
|
|
|
|
|
user = User(
|
|
first_name='John',
|
|
second_name='Doe',
|
|
address=Address(
|
|
post_code=123456,
|
|
country=Country(
|
|
name='USA',
|
|
phone_code=1
|
|
)
|
|
),
|
|
card_details=CardDetails(
|
|
number=4212934504460000,
|
|
expires=datetime.date(2020, 5, 1)
|
|
),
|
|
hobbies=[
|
|
Hobby(name='Programming', info='Writing code and stuff'),
|
|
Hobby(name='Gaming', info='Hell Yeah!!!'),
|
|
],
|
|
)
|
|
|
|
exclude_keys = {
|
|
'second_name': True,
|
|
'address': {'post_code': True, 'country': {'phone_code'}},
|
|
'card_details': True,
|
|
# You can exclude fields from specific members of a tuple/list by index:
|
|
'hobbies': {-1: {'info'}},
|
|
}
|
|
|
|
include_keys = {
|
|
'first_name': True,
|
|
'address': {'country': {'name'}},
|
|
'hobbies': {0: True, -1: {'name'}},
|
|
}
|
|
|
|
# would be the same as user.dict(exclude=exclude_keys) in this case:
|
|
print(user.dict(include=include_keys))
|
|
|
|
# To exclude a field from all members of a nested list or tuple, use "__all__":
|
|
print(user.dict(exclude={'hobbies': {'__all__': {'info'}}}))
|