Skip to content

Commit dcf557c

Browse files
author
林志文
committed
- Add return_int parameter to Enum[8|16]Field to control whether to get an int or str value when querying from the database.
- Fix TupleField container_class. - Add fields documentation.
1 parent 1487bf8 commit dcf557c

File tree

7 files changed

+542
-77
lines changed

7 files changed

+542
-77
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,13 @@ $ tox
317317
Changelog
318318
---
319319

320+
### 1.0.1 (2023-02-23)
321+
322+
- Add `return_int` parameter to `Enum[8|16]Field` to control whether to get an int or str value when querying from the database.
323+
- Fix TupleField container_class.
324+
- Add fields documentation.
325+
326+
320327
### 1.0.0 (2023-02-21)
321328

322329
- Add tests for migrations.

clickhouse_backend/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.0
1+
1.0.1

clickhouse_backend/driver/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
)
99

1010
from .connection import Connection
11+
# Binary is compatible for django's BinaryField.
1112
from .types import ( # NOQA
1213
Binary
1314
)

clickhouse_backend/models/fields/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
"UUIDField",
2929
"DateField", "Date32Field", "DateTimeField", "DateTime64Field",
3030
"Enum8Field", "Enum16Field", "EnumField",
31-
"ArrayField", "TupleField", "MapField",
3231
"IPv4Field", "IPv6Field", "GenericIPAddressField",
32+
"ArrayField", "TupleField", "MapField",
3333
]
3434

3535

@@ -256,6 +256,11 @@ class EnumField(FieldMixin, fields.Field):
256256
MIN_INT = -32768
257257
MAX_INT = 32767
258258

259+
def __init__(self, *args, return_int=True, **kwargs):
260+
"""Use return_int to control whether to get an int or str value when querying from the database."""
261+
self.return_int = return_int
262+
super().__init__(*args, **kwargs)
263+
259264
def _check_choices(self):
260265
"""Note: although clickhouse support arbitrary bytes in Enum name,
261266
but clickhouse-driver 0.2.5 will raise UnicodeDecodeError when execute query."""
@@ -343,7 +348,8 @@ def get_prep_value(self, value):
343348
return value
344349

345350
def from_db_value(self, value, expression, connection):
346-
if value is None:
351+
"""Clickhouse return enum name for Enum column."""
352+
if value is None or not self.return_int:
347353
return value
348354
return self._name_value_map[value]
349355

clickhouse_backend/models/fields/tuple.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,6 @@ def check(self, **kwargs):
102102
)
103103
]
104104

105-
if self.is_named_tuple:
106-
name = self.name
107-
if name:
108-
name = name.capitalize()
109-
else:
110-
name = "Tuple"
111-
self.container_class = collections.namedtuple(name, (fn for fn, _ in self.base_fields))
112-
else:
113-
self.container_class = tuple
114-
115105
return []
116106

117107
def get_internal_type(self):
@@ -144,6 +134,15 @@ def set_attributes_from_name(self, name):
144134
field.set_attributes_from_name(name)
145135
else:
146136
field[1].set_attributes_from_name(name)
137+
if self.is_named_tuple:
138+
name = self.name
139+
if name:
140+
name = name.capitalize()
141+
else:
142+
name = "Tuple"
143+
self.container_class = collections.namedtuple(name, (fn for fn, _ in self.base_fields))
144+
else:
145+
self.container_class = tuple
147146

148147
def _convert_type(self, value):
149148
if value is None or isinstance(value, self.container_class):

docs/Fields.md

Lines changed: 508 additions & 50 deletions
Large diffs are not rendered by default.

tests/ch_fields/test_tuplefield.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,16 @@ def test_validate(self):
7777
base_fields=[
7878
models.TupleField(
7979
base_fields=[
80-
models.Int8Field(name="field"),
81-
models.IPv4Field(name="field")
80+
models.Int8Field(),
81+
models.IPv4Field()
8282
],
83-
name="field"
8483
),
8584
models.ArrayField(
86-
base_field=models.StringField(name="field"),
87-
name="field"
85+
base_field=models.StringField(),
8886
)
8987
],
90-
name="field"
9188
)
92-
field.check()
89+
field.set_attributes_from_name("field")
9390
with self.assertRaises(ValidationError):
9491
field.clean([130], None)
9592
with self.assertRaises(ValidationError):
@@ -105,23 +102,20 @@ def test_validate(self):
105102
"tup",
106103
models.TupleField(
107104
base_fields=[
108-
("int", models.Int8Field(name="field")),
109-
("ip", models.IPv4Field(name="field"))
105+
("int", models.Int8Field()),
106+
("ip", models.IPv4Field())
110107
],
111-
name="field"
112108
)
113109
),
114110
(
115111
"arr",
116112
models.ArrayField(
117-
base_field=models.StringField(name="field"),
118-
name="field"
113+
base_field=models.StringField(),
119114
)
120115
)
121116
],
122-
name="field"
123117
)
124-
field.check()
118+
field.set_attributes_from_name("field")
125119
with self.assertRaises(ValidationError):
126120
field.clean([130], None)
127121
with self.assertRaises(ValidationError):

0 commit comments

Comments
 (0)