#29738: Django can't serialize DateTimeTZRange(lower=None, upper=None,
bounds='[)')
----------------------------------+------------------------------------
Reporter: grahammayer | Owner: nobody
Type: Bug | Status: new
Component: contrib.postgres | Version: 2.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 1
Needs tests: 1 | Patch needs improvement: 0
Easy pickings: 1 | UI/UX: 0
----------------------------------+------------------------------------
Changes (by Simon Charette):
* keywords: rangefield, postgresql, psycopg2, migrations =>
Old description:
> Tried to use {{{DateTimeTZRange(lower=None, upper=None, bounds='[)')}}}
> as a default for a model field and get the following error when running
> {{{python manage.py makemigrations}}}:
>
> {{{
> Traceback (most recent call last):
> File "manage.py", line 12, in <module>
> execute_from_command_line(sys.argv)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/core/management/__init__.py", line 371, in
> execute_from_command_line
> utility.execute()
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/core/management/__init__.py", line 365, in execute
> self.fetch_command(subcommand).run_from_argv(self.argv)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/core/management/base.py", line 288, in run_from_argv
> self.execute(*args, **cmd_options)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/core/management/base.py", line 335, in execute
> output = self.handle(*args, **options)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/core/management/commands/makemigrations.py", line 172, in
> handle
> self.write_migration_files(changes)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/core/management/commands/makemigrations.py", line 210, in
> write_migration_files
> migration_string = writer.as_string()
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/writer.py", line 151, in as_string
> operation_string, operation_imports =
> OperationWriter(operation).serialize()
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/writer.py", line 110, in serialize
> _write(arg_name, arg_value)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/writer.py", line 74, in _write
> arg_string, arg_imports = MigrationWriter.serialize(_arg_value)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/writer.py", line 279, in serialize
> return serializer_factory(value).serialize()
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/serializer.py", line 203, in serialize
> return self.serialize_deconstructed(path, args, kwargs)
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/serializer.py", line 90, in
> serialize_deconstructed
> arg_string, arg_imports = serializer_factory(arg).serialize()
> File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
> packages/django/db/migrations/serializer.py", line 370, in
> serializer_factory
> "topics/migrations/#migration-serializing" % (value,
> get_docs_version())
> ValueError: Cannot serialize: DateTimeTZRange(None, None, '[)')
> }}}
New description:
Tried to use DateTimeTZRange(lower=None, upper=None, bounds='[)') as a
default for a model field and get the following error when running 'python
manage.py makemigrations':
{{{
Traceback (most recent call last):
File "manage.py", line 12, in <module>
execute_from_command_line(sys.argv)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/core/management/__init__.py", line 371, in
execute_from_command_line
utility.execute()
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/core/management/__init__.py", line 365, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/core/management/base.py", line 335, in execute
output = self.handle(*args, **options)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/core/management/commands/makemigrations.py", line 172, in
handle
self.write_migration_files(changes)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/core/management/commands/makemigrations.py", line 210, in
write_migration_files
migration_string = writer.as_string()
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/writer.py", line 151, in as_string
operation_string, operation_imports =
OperationWriter(operation).serialize()
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/writer.py", line 110, in serialize
_write(arg_name, arg_value)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/writer.py", line 74, in _write
arg_string, arg_imports = MigrationWriter.serialize(_arg_value)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/writer.py", line 279, in serialize
return serializer_factory(value).serialize()
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/serializer.py", line 203, in serialize
return self.serialize_deconstructed(path, args, kwargs)
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/serializer.py", line 90, in
serialize_deconstructed
arg_string, arg_imports = serializer_factory(arg).serialize()
File "/home/grahammayer/logimeter/logimeter/lib/python3.6/site-
packages/django/db/migrations/serializer.py", line 370, in
serializer_factory
"topics/migrations/#migration-serializing" % (value,
get_docs_version())
ValueError: Cannot serialize: DateTimeTZRange(None, None, '[)')
}}}
--
Comment:
A solution could to make `django.db.migration.serializer` offer a way to
register serializers for types and have
`django.contrib.postgres.App.ready()` be in charge of registering the ones
to handle `psycopg2` range types.
If the registry uses an `OrderedDict` we should be able to replace
[https://github.com/django/django/blob/570402ffd7efd529eb597d86525b80a6fbfca0e7/django/db/migrations/serializer.py#L273-L327
that long series of if] by iterating over the registry items.
{{{#!python
registry = OrderedDict([
(models.Field, ModelFieldSerializer),
...
])
def serializer_factory(value):
if isinstance(value, Promise):
value = str(value)
elif isinstance(value, LazyObject):
# The unwrapped value is returned as the first item of the
arguments
# tuple.
value = value.__reduce__()[1][0]
for type_, serializer_cls in registry.items():
if isinstance(value, type_):
return serializer_cls(value)
raise ValueError(...)
}}}
The `hasattr` and checks could be performed using `abc`s.
{{{#!python
from abc import ABC
class Deconstructable(ABC):
@classmethod
def __subclasshook__(cls, C):
return hasattr(C, 'deconstruct')
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/29738#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/069.13319c1d76e7963cb0bfbe8eb5577e80%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.