1111from django .apps import apps
1212from django .conf import settings
1313from django .core .exceptions import FieldDoesNotExist
14+ from django .db import transaction
1415from django .db .models import (
1516 AutoField ,
1617 BooleanField ,
@@ -99,6 +100,7 @@ def make(
99100 _create_files : bool = False ,
100101 _using : str = "" ,
101102 _bulk_create : bool = False ,
103+ _full_clean : bool = False ,
102104 ** attrs : Any ,
103105) -> M : ...
104106
@@ -114,6 +116,7 @@ def make(
114116 _using : str = "" ,
115117 _bulk_create : bool = False ,
116118 _fill_optional : list [str ] | bool = False ,
119+ _full_clean : bool = False ,
117120 ** attrs : Any ,
118121) -> list [M ]: ...
119122
@@ -128,6 +131,7 @@ def make(
128131 _using : str = "" ,
129132 _bulk_create : bool = False ,
130133 _fill_optional : list [str ] | bool = False ,
134+ _full_clean : bool = False ,
131135 ** attrs : Any ,
132136):
133137 """Create a persisted instance from a given model its associated models.
@@ -144,20 +148,26 @@ def make(
144148 raise InvalidQuantityException
145149
146150 if _bulk_create :
147- result = bulk_create (baker , _quantity or 1 , _save_kwargs = _save_kwargs , ** attrs )
151+ result = bulk_create (
152+ baker , _quantity or 1 , _save_kwargs = _save_kwargs , _full_clean = _full_clean , ** attrs
153+ )
148154 return result if _quantity else result [0 ]
149155 elif _quantity :
150156 return [
151157 baker .make (
152158 _save_kwargs = _save_kwargs ,
153159 _refresh_after_create = _refresh_after_create ,
160+ _full_clean = _full_clean ,
154161 ** attrs ,
155162 )
156163 for _ in range (_quantity )
157164 ]
158165
159166 return baker .make (
160- _save_kwargs = _save_kwargs , _refresh_after_create = _refresh_after_create , ** attrs
167+ _save_kwargs = _save_kwargs ,
168+ _refresh_after_create = _refresh_after_create ,
169+ _full_clean = _full_clean ,
170+ ** attrs ,
161171 )
162172
163173
@@ -167,6 +177,7 @@ def prepare(
167177 _quantity : None = None ,
168178 _save_related : bool = False ,
169179 _using : str = "" ,
180+ _full_clean : bool = False ,
170181 ** attrs : Any ,
171182) -> M : ...
172183
@@ -178,6 +189,7 @@ def prepare(
178189 _save_related : bool = False ,
179190 _using : str = "" ,
180191 _fill_optional : list [str ] | bool = False ,
192+ _full_clean : bool = False ,
181193 ** attrs : Any ,
182194) -> list [M ]: ...
183195
@@ -188,6 +200,7 @@ def prepare(
188200 _save_related : bool = False ,
189201 _using : str = "" ,
190202 _fill_optional : list [str ] | bool = False ,
203+ _full_clean : bool = False ,
191204 ** attrs : Any ,
192205):
193206 """Create but do not persist an instance from a given model.
@@ -202,11 +215,11 @@ def prepare(
202215
203216 if _quantity :
204217 return [
205- baker .prepare (_save_related = _save_related , ** attrs )
218+ baker .prepare (_save_related = _save_related , _full_clean = _full_clean , ** attrs )
206219 for i in range (_quantity )
207220 ]
208221
209- return baker .prepare (_save_related = _save_related , ** attrs )
222+ return baker .prepare (_save_related = _save_related , _full_clean = _full_clean , ** attrs )
210223
211224
212225def _recipe (name : str ) -> Any :
@@ -403,6 +416,7 @@ def make(
403416 _refresh_after_create : bool = False ,
404417 _from_manager = None ,
405418 _fill_optional : list [str ] | bool = False ,
419+ _full_clean : bool = False ,
406420 ** attrs : Any ,
407421 ):
408422 """Create and persist an instance of the model associated with Baker instance."""
@@ -413,6 +427,7 @@ def make(
413427 "_refresh_after_create" : _refresh_after_create ,
414428 "_from_manager" : _from_manager ,
415429 "_fill_optional" : _fill_optional ,
430+ "_full_clean" : _full_clean ,
416431 }
417432 params .update (attrs )
418433 return self ._make (** params )
@@ -421,13 +436,15 @@ def prepare(
421436 self ,
422437 _save_related = False ,
423438 _fill_optional : list [str ] | bool = False ,
439+ _full_clean : bool = False ,
424440 ** attrs : Any ,
425441 ) -> M :
426442 """Create, but do not persist, an instance of the associated model."""
427443 params = {
428444 "commit" : False ,
429445 "commit_related" : _save_related ,
430446 "_fill_optional" : _fill_optional ,
447+ "_full_clean" : _full_clean ,
431448 }
432449 params .update (attrs )
433450 return self ._make (** params )
@@ -444,6 +461,7 @@ def _make( # noqa: C901
444461 _save_kwargs = None ,
445462 _refresh_after_create = False ,
446463 _from_manager = None ,
464+ _full_clean = False ,
447465 ** attrs : Any ,
448466 ) -> M :
449467 _save_kwargs = _save_kwargs or {}
@@ -496,6 +514,7 @@ def _make( # noqa: C901
496514 _commit = commit ,
497515 _from_manager = _from_manager ,
498516 _save_kwargs = _save_kwargs ,
517+ _full_clean = _full_clean ,
499518 )
500519 if commit :
501520 for related in self .model ._meta .related_objects :
@@ -514,7 +533,7 @@ def m2m_value(self, field: ManyToManyField) -> list[Any]:
514533 return self .generate_value (field )
515534
516535 def instance (
517- self , attrs : dict [str , Any ], _commit , _save_kwargs , _from_manager
536+ self , attrs : dict [str , Any ], _commit , _save_kwargs , _from_manager , _full_clean = False
518537 ) -> M :
519538 one_to_many_keys = {}
520539 auto_now_keys = {}
@@ -546,6 +565,9 @@ def instance(
546565 instance , generic_foreign_keys , commit = _commit
547566 )
548567
568+ if _full_clean :
569+ instance .full_clean ()
570+
549571 if _commit :
550572 instance .save (** _save_kwargs )
551573 self ._handle_one_to_many (instance , one_to_many_keys )
@@ -925,7 +947,7 @@ def _save_related_objs(model, objects, _using=None) -> None:
925947 setattr (objects [i ], fk .name , fk_obj )
926948
927949
928- def bulk_create (baker : Baker [M ], quantity : int , ** kwargs ) -> list [M ]: # noqa: C901
950+ def bulk_create (baker : Baker [M ], quantity : int , _full_clean : bool = False , ** kwargs ) -> list [M ]: # noqa: C901
929951 """
930952 Bulk create entries and all related FKs as well.
931953
@@ -936,6 +958,7 @@ def bulk_create(baker: Baker[M], quantity: int, **kwargs) -> list[M]: # noqa: C
936958 # quantity number of times, passing in the additional keyword arguments
937959 entries = [
938960 baker .prepare (
961+ _full_clean = _full_clean ,
939962 ** kwargs ,
940963 )
941964 for _ in range (quantity )
@@ -949,7 +972,11 @@ def bulk_create(baker: Baker[M], quantity: int, **kwargs) -> list[M]: # noqa: C
949972 else :
950973 manager = baker .model ._base_manager
951974
952- created_entries = manager .bulk_create (entries )
975+ if _full_clean :
976+ with transaction .atomic ():
977+ created_entries = manager .bulk_create (entries )
978+ else :
979+ created_entries = manager .bulk_create (entries )
953980
954981 # set many-to-many relations from kwargs
955982 for entry in created_entries :
0 commit comments