Skip to content

Commit 4b122c3

Browse files
committed
fixes #56
1 parent 90d4b73 commit 4b122c3

File tree

8 files changed

+446
-1
lines changed

8 files changed

+446
-1
lines changed

django_enum/fields.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232

3333
T = TypeVar('T') # pylint: disable=C0103
3434

35+
try:
36+
from django.db.models.expressions import DatabaseDefault
37+
except ImportError: # pragma: no cover
38+
class DatabaseDefault:
39+
pass
40+
3541

3642
def with_typehint(baseclass: Type[T]) -> Type[T]:
3743
"""
@@ -56,7 +62,11 @@ class ToPythonDeferredAttribute(DeferredAttribute):
5662

5763
def __set__(self, instance: Model, value: Any):
5864
try:
59-
instance.__dict__[self.field.name] = self.field.to_python(value)
65+
instance.__dict__[self.field.name] = (
66+
value
67+
if isinstance(value, DatabaseDefault) else
68+
self.field.to_python(value)
69+
)
6070
except (ValidationError, ValueError):
6171
# Django core fields allow assignment of any value, we do the same
6272
instance.__dict__[self.field.name] = value

django_enum/tests/db_default/__init__.py

Whitespace-only changes.

django_enum/tests/db_default/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class DBDefaultConfig(AppConfig):
5+
name = 'django_enum.tests.db_default'
6+
label = name.replace('.', '_')
Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
# Generated by Django 5.0 on 2023-12-13 20:24
2+
3+
import django_enum.fields
4+
import django_enum.tests.djenum.enums
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = []
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="DBDefaultTester",
17+
fields=[
18+
(
19+
"id",
20+
models.BigAutoField(
21+
auto_created=True,
22+
primary_key=True,
23+
serialize=False,
24+
verbose_name="ID",
25+
),
26+
),
27+
(
28+
"small_pos_int",
29+
django_enum.fields.EnumPositiveSmallIntegerField(
30+
blank=True,
31+
choices=[
32+
(0, "Value 1"),
33+
(2, "Value 2"),
34+
(32767, "Value 32767"),
35+
],
36+
db_default=models.Value(None),
37+
null=True,
38+
),
39+
),
40+
(
41+
"small_int",
42+
django_enum.fields.EnumSmallIntegerField(
43+
blank=True,
44+
choices=[
45+
(-32768, "Value -32768"),
46+
(0, "Value 0"),
47+
(1, "Value 1"),
48+
(2, "Value 2"),
49+
(32767, "Value 32767"),
50+
],
51+
db_default=models.Value(32767),
52+
),
53+
),
54+
(
55+
"pos_int",
56+
django_enum.fields.EnumPositiveIntegerField(
57+
blank=True,
58+
choices=[
59+
(0, "Value 0"),
60+
(1, "Value 1"),
61+
(2, "Value 2"),
62+
(2147483647, "Value 2147483647"),
63+
],
64+
db_default=models.Value(2147483647),
65+
),
66+
),
67+
(
68+
"int",
69+
django_enum.fields.EnumIntegerField(
70+
blank=True,
71+
choices=[
72+
(-2147483648, "Value -2147483648"),
73+
(0, "Value 0"),
74+
(1, "Value 1"),
75+
(2, "Value 2"),
76+
(2147483647, "Value 2147483647"),
77+
],
78+
db_default=models.Value(-2147483648),
79+
null=True,
80+
),
81+
),
82+
(
83+
"big_pos_int",
84+
django_enum.fields.EnumPositiveBigIntegerField(
85+
blank=True,
86+
choices=[
87+
(0, "Value 0"),
88+
(1, "Value 1"),
89+
(2, "Value 2"),
90+
(2147483648, "Value 2147483648"),
91+
],
92+
db_default=models.Value(None),
93+
null=True,
94+
),
95+
),
96+
(
97+
"big_int",
98+
django_enum.fields.EnumBigIntegerField(
99+
blank=True,
100+
choices=[
101+
(-2147483649, "Value -2147483649"),
102+
(1, "Value 1"),
103+
(2, "Value 2"),
104+
(2147483648, "Value 2147483648"),
105+
],
106+
db_default=models.Value(-2147483649),
107+
),
108+
),
109+
(
110+
"constant",
111+
django_enum.fields.EnumFloatField(
112+
blank=True,
113+
choices=[
114+
(3.141592653589793, "Pi"),
115+
(2.71828, "Euler's Number"),
116+
(1.618033988749895, "Golden Ratio"),
117+
],
118+
db_default=models.Value(1.618033988749895),
119+
null=True,
120+
),
121+
),
122+
(
123+
"text",
124+
django_enum.fields.EnumCharField(
125+
blank=True,
126+
choices=[
127+
("V1", "Value1"),
128+
("V22", "Value2"),
129+
("V333", "Value3"),
130+
("D", "Default"),
131+
],
132+
db_default=models.Value(""),
133+
max_length=4,
134+
),
135+
),
136+
(
137+
"doubled_text",
138+
django_enum.fields.EnumCharField(
139+
blank=True,
140+
choices=[
141+
("V1", "Value1"),
142+
("V22", "Value2"),
143+
("V333", "Value3"),
144+
("D", "Default"),
145+
],
146+
db_default=models.Value("db_default"),
147+
default="",
148+
max_length=10,
149+
),
150+
),
151+
(
152+
"doubled_text_strict",
153+
django_enum.fields.EnumCharField(
154+
blank=True,
155+
choices=[
156+
("V1", "Value1"),
157+
("V22", "Value2"),
158+
("V333", "Value3"),
159+
("D", "Default"),
160+
],
161+
db_default=models.Value("V22"),
162+
default="D",
163+
max_length=10,
164+
),
165+
),
166+
(
167+
"char_field",
168+
models.CharField(
169+
blank=True, db_default=models.Value("db_default"), max_length=10
170+
),
171+
),
172+
(
173+
"doubled_char_field",
174+
models.CharField(
175+
blank=True,
176+
db_default=models.Value("db_default"),
177+
default="default",
178+
max_length=10,
179+
),
180+
),
181+
(
182+
"extern",
183+
django_enum.fields.EnumPositiveSmallIntegerField(
184+
blank=True,
185+
choices=[(1, "ONE"), (2, "TWO"), (3, "THREE")],
186+
db_default=models.Value(
187+
django_enum.tests.djenum.enums.ExternEnum["THREE"]
188+
),
189+
null=True,
190+
),
191+
),
192+
(
193+
"dj_int_enum",
194+
django_enum.fields.EnumPositiveSmallIntegerField(
195+
choices=[(1, "One"), (2, "Two"), (3, "Three")],
196+
db_default=models.Value(1),
197+
),
198+
),
199+
(
200+
"dj_text_enum",
201+
django_enum.fields.EnumCharField(
202+
choices=[("A", "Label A"), ("B", "Label B"), ("C", "Label C")],
203+
db_default=models.Value("A"),
204+
max_length=1,
205+
),
206+
),
207+
(
208+
"non_strict_int",
209+
django_enum.fields.EnumPositiveSmallIntegerField(
210+
blank=True,
211+
choices=[
212+
(0, "Value 1"),
213+
(2, "Value 2"),
214+
(32767, "Value 32767"),
215+
],
216+
db_default=models.Value(5),
217+
null=True,
218+
),
219+
),
220+
(
221+
"non_strict_text",
222+
django_enum.fields.EnumCharField(
223+
blank=True,
224+
choices=[
225+
("V1", "Value1"),
226+
("V22", "Value2"),
227+
("V333", "Value3"),
228+
("D", "Default"),
229+
],
230+
db_default=models.Value("arbitrary"),
231+
max_length=12,
232+
),
233+
),
234+
(
235+
"no_coerce",
236+
django_enum.fields.EnumPositiveSmallIntegerField(
237+
blank=True,
238+
choices=[
239+
(0, "Value 1"),
240+
(2, "Value 2"),
241+
(32767, "Value 32767"),
242+
],
243+
db_default=models.Value(2),
244+
null=True,
245+
),
246+
),
247+
(
248+
"no_coerce_value",
249+
django_enum.fields.EnumPositiveSmallIntegerField(
250+
blank=True,
251+
choices=[
252+
(0, "Value 1"),
253+
(2, "Value 2"),
254+
(32767, "Value 32767"),
255+
],
256+
db_default=models.Value(32767),
257+
null=True,
258+
),
259+
),
260+
(
261+
"no_coerce_none",
262+
django_enum.fields.EnumPositiveSmallIntegerField(
263+
blank=True,
264+
choices=[
265+
(0, "Value 1"),
266+
(2, "Value 2"),
267+
(32767, "Value 32767"),
268+
],
269+
db_default=models.Value(None),
270+
null=True,
271+
),
272+
),
273+
],
274+
options={
275+
"ordering": ("id",),
276+
},
277+
),
278+
]

django_enum/tests/db_default/migrations/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)