@@ -77,9 +77,87 @@ def gen_from_choices(choices: List) -> Callable:
7777
7878
7979def gen_integer (min_int : int = - MAX_INT , max_int : int = MAX_INT ) -> int :
80+ warnings .warn (
81+ "gen_integer() may cause overflow errors with Django integer fields due to "
82+ "large default MAX_INT value. Consider using field-specific generators instead:\n "
83+ "- gen_positive_small_integer() for PositiveSmallIntegerField\n "
84+ "- gen_small_integer() for SmallIntegerField\n "
85+ "- gen_regular_integer() for IntegerField\n "
86+ "- gen_positive_integer() for PositiveIntegerField\n "
87+ "- gen_big_integer() for BigIntegerField\n "
88+ "- gen_positive_big_integer() for PositiveBigIntegerField\n "
89+ "See model_bakery.random_gen documentation for more details." ,
90+ DeprecationWarning ,
91+ stacklevel = 2 ,
92+ )
8093 return baker_random .randint (min_int , max_int )
8194
8295
96+ def _get_field_range (field_name : str ):
97+ """Get field range from Django's BaseDatabaseOperations."""
98+ from django .db .backends .base .operations import BaseDatabaseOperations
99+
100+ return BaseDatabaseOperations .integer_field_ranges .get (
101+ field_name , (- MAX_INT , MAX_INT )
102+ )
103+
104+
105+ def gen_small_integer (min_int : int = None , max_int : int = None ) -> int :
106+ """Generate integer for SmallIntegerField."""
107+ field_min , field_max = _get_field_range ("SmallIntegerField" )
108+ actual_min = min_int if min_int is not None else field_min
109+ actual_max = max_int if max_int is not None else field_max
110+ return baker_random .randint (actual_min , actual_max )
111+
112+
113+ def gen_positive_small_integer (min_int : int = None , max_int : int = None ) -> int :
114+ """Generate integer for PositiveSmallIntegerField."""
115+ field_min , field_max = _get_field_range ("PositiveSmallIntegerField" )
116+ actual_min = min_int if min_int is not None else max (field_min , 1 )
117+ actual_max = max_int if max_int is not None else field_max
118+ return baker_random .randint (actual_min , actual_max )
119+
120+
121+ def gen_positive_integer (min_int : int = None , max_int : int = None ) -> int :
122+ """Generate integer for PositiveIntegerField."""
123+ field_min , field_max = _get_field_range ("PositiveIntegerField" )
124+ actual_min = min_int if min_int is not None else max (field_min , 1 )
125+ actual_max = max_int if max_int is not None else field_max
126+ return baker_random .randint (actual_min , actual_max )
127+
128+
129+ def gen_big_integer (min_int : int = None , max_int : int = None ) -> int :
130+ """Generate integer for BigIntegerField."""
131+ field_min , field_max = _get_field_range ("BigIntegerField" )
132+ actual_min = min_int if min_int is not None else field_min
133+ actual_max = max_int if max_int is not None else field_max
134+ return baker_random .randint (actual_min , actual_max )
135+
136+
137+ def gen_positive_big_integer (min_int : int = None , max_int : int = None ) -> int :
138+ """Generate integer for PositiveBigIntegerField."""
139+ field_min , field_max = _get_field_range ("PositiveBigIntegerField" )
140+ actual_min = min_int if min_int is not None else max (field_min , 1 )
141+ actual_max = max_int if max_int is not None else field_max
142+ return baker_random .randint (actual_min , actual_max )
143+
144+
145+ def gen_regular_integer (min_int : int = None , max_int : int = None ) -> int :
146+ """Generate integer for IntegerField."""
147+ field_min , field_max = _get_field_range ("IntegerField" )
148+ actual_min = min_int if min_int is not None else field_min
149+ actual_max = max_int if max_int is not None else field_max
150+ return baker_random .randint (actual_min , actual_max )
151+
152+
153+ def gen_auto_field (min_int : int = None , max_int : int = None ) -> int :
154+ """Generate integer for AutoField."""
155+ field_min , field_max = _get_field_range ("AutoField" )
156+ actual_min = min_int if min_int is not None else max (field_min , 1 )
157+ actual_max = max_int if max_int is not None else field_max
158+ return baker_random .randint (actual_min , actual_max )
159+
160+
83161def gen_float () -> float :
84162 return baker_random .random () * gen_integer ()
85163
0 commit comments