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,30 @@ 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 ,
153+ _quantity or 1 ,
154+ _save_kwargs = _save_kwargs ,
155+ _full_clean = _full_clean ,
156+ ** attrs ,
157+ )
148158 return result if _quantity else result [0 ]
149159 elif _quantity :
150160 return [
151161 baker .make (
152162 _save_kwargs = _save_kwargs ,
153163 _refresh_after_create = _refresh_after_create ,
164+ _full_clean = _full_clean ,
154165 ** attrs ,
155166 )
156167 for _ in range (_quantity )
157168 ]
158169
159170 return baker .make (
160- _save_kwargs = _save_kwargs , _refresh_after_create = _refresh_after_create , ** attrs
171+ _save_kwargs = _save_kwargs ,
172+ _refresh_after_create = _refresh_after_create ,
173+ _full_clean = _full_clean ,
174+ ** attrs ,
161175 )
162176
163177
@@ -167,6 +181,7 @@ def prepare(
167181 _quantity : None = None ,
168182 _save_related : bool = False ,
169183 _using : str = "" ,
184+ _full_clean : bool = False ,
170185 ** attrs : Any ,
171186) -> M : ...
172187
@@ -178,6 +193,7 @@ def prepare(
178193 _save_related : bool = False ,
179194 _using : str = "" ,
180195 _fill_optional : list [str ] | bool = False ,
196+ _full_clean : bool = False ,
181197 ** attrs : Any ,
182198) -> list [M ]: ...
183199
@@ -188,6 +204,7 @@ def prepare(
188204 _save_related : bool = False ,
189205 _using : str = "" ,
190206 _fill_optional : list [str ] | bool = False ,
207+ _full_clean : bool = False ,
191208 ** attrs : Any ,
192209):
193210 """Create but do not persist an instance from a given model.
@@ -202,11 +219,11 @@ def prepare(
202219
203220 if _quantity :
204221 return [
205- baker .prepare (_save_related = _save_related , ** attrs )
222+ baker .prepare (_save_related = _save_related , _full_clean = _full_clean , ** attrs )
206223 for i in range (_quantity )
207224 ]
208225
209- return baker .prepare (_save_related = _save_related , ** attrs )
226+ return baker .prepare (_save_related = _save_related , _full_clean = _full_clean , ** attrs )
210227
211228
212229def _recipe (name : str ) -> Any :
@@ -403,6 +420,7 @@ def make(
403420 _refresh_after_create : bool = False ,
404421 _from_manager = None ,
405422 _fill_optional : list [str ] | bool = False ,
423+ _full_clean : bool = False ,
406424 ** attrs : Any ,
407425 ):
408426 """Create and persist an instance of the model associated with Baker instance."""
@@ -413,6 +431,7 @@ def make(
413431 "_refresh_after_create" : _refresh_after_create ,
414432 "_from_manager" : _from_manager ,
415433 "_fill_optional" : _fill_optional ,
434+ "_full_clean" : _full_clean ,
416435 }
417436 params .update (attrs )
418437 return self ._make (** params )
@@ -421,13 +440,15 @@ def prepare(
421440 self ,
422441 _save_related = False ,
423442 _fill_optional : list [str ] | bool = False ,
443+ _full_clean : bool = False ,
424444 ** attrs : Any ,
425445 ) -> M :
426446 """Create, but do not persist, an instance of the associated model."""
427447 params = {
428448 "commit" : False ,
429449 "commit_related" : _save_related ,
430450 "_fill_optional" : _fill_optional ,
451+ "_full_clean" : _full_clean ,
431452 }
432453 params .update (attrs )
433454 return self ._make (** params )
@@ -444,6 +465,7 @@ def _make( # noqa: C901
444465 _save_kwargs = None ,
445466 _refresh_after_create = False ,
446467 _from_manager = None ,
468+ _full_clean = False ,
447469 ** attrs : Any ,
448470 ) -> M :
449471 _save_kwargs = _save_kwargs or {}
@@ -496,6 +518,7 @@ def _make( # noqa: C901
496518 _commit = commit ,
497519 _from_manager = _from_manager ,
498520 _save_kwargs = _save_kwargs ,
521+ _full_clean = _full_clean ,
499522 )
500523 if commit :
501524 for related in self .model ._meta .related_objects :
@@ -514,7 +537,12 @@ def m2m_value(self, field: ManyToManyField) -> list[Any]:
514537 return self .generate_value (field )
515538
516539 def instance (
517- self , attrs : dict [str , Any ], _commit , _save_kwargs , _from_manager
540+ self ,
541+ attrs : dict [str , Any ],
542+ _commit ,
543+ _save_kwargs ,
544+ _from_manager ,
545+ _full_clean = False ,
518546 ) -> M :
519547 one_to_many_keys = {}
520548 auto_now_keys = {}
@@ -546,6 +574,9 @@ def instance(
546574 instance , generic_foreign_keys , commit = _commit
547575 )
548576
577+ if _full_clean :
578+ instance .full_clean ()
579+
549580 if _commit :
550581 instance .save (** _save_kwargs )
551582 self ._handle_one_to_many (instance , one_to_many_keys )
@@ -925,7 +956,9 @@ def _save_related_objs(model, objects, _using=None) -> None:
925956 setattr (objects [i ], fk .name , fk_obj )
926957
927958
928- def bulk_create (baker : Baker [M ], quantity : int , ** kwargs ) -> list [M ]: # noqa: C901
959+ def bulk_create (
960+ baker : Baker [M ], quantity : int , _full_clean : bool = False , ** kwargs
961+ ) -> list [M ]: # noqa: C901
929962 """
930963 Bulk create entries and all related FKs as well.
931964
@@ -936,6 +969,7 @@ def bulk_create(baker: Baker[M], quantity: int, **kwargs) -> list[M]: # noqa: C
936969 # quantity number of times, passing in the additional keyword arguments
937970 entries = [
938971 baker .prepare (
972+ _full_clean = _full_clean ,
939973 ** kwargs ,
940974 )
941975 for _ in range (quantity )
@@ -949,7 +983,11 @@ def bulk_create(baker: Baker[M], quantity: int, **kwargs) -> list[M]: # noqa: C
949983 else :
950984 manager = baker .model ._base_manager
951985
952- created_entries = manager .bulk_create (entries )
986+ if _full_clean :
987+ with transaction .atomic ():
988+ created_entries = manager .bulk_create (entries )
989+ else :
990+ created_entries = manager .bulk_create (entries )
953991
954992 # set many-to-many relations from kwargs
955993 for entry in created_entries :
0 commit comments