Hello Alexis,
As you've noticed Django 1.8 changed values()/values_list() to converts
values returned
from the database just like any other ORM method[0].
If you want to use the json module to serialize your horari.Horari
instances you'll have
to define your own JSONEncoder (or DjangoJSONEncoder) subclass.
class ToStrJSONEncoder(DjangoJSONEncoder):
def default(o):
if hasattr(o, 'to_str'):
return o.to_str()
return super().default(o)
Cheers,
Simon
[0] https://docs.djangoproject.com/en/1.8/releases/1.8/#subfieldbase
Le samedi 3 juin 2017 08:44:07 UTC-4, Alexis Roda a écrit :
>
> Hi,
>
> I have a custom ModelField (HorariField, a simple weekly timetable)
> written for django 1.7 and I'm trying to upgrade it to work with django
> 1.10, so I have removed the SubfieldBase metaclass and added the
> from_db_value method. The field inherits from CharField and stores Horari
> instances that are serialized to/from strings like "mo,tu,we:08:00-14:00",
> it works like the HandField in the django docs.
>
> After the changes I'm getting errors when serializing to json the models
> that have that kind of field:
>
> TypeError: <hera_django.lib.horari.Horari object at 0x7fb3f1e619d0> is not
> JSON serializable
>
> I'm not using the django serializers. The json serialization look like:
>
> json.dumps(list(result), cls=DjangoJSONEncoder)
>
> where result is a ValuesQuerySet.
>
> After some debugging it seems that with the old HorariField class the
> json serializer already receives a serialized value, so it worked until
> now, but upgrading the field class the serializer receives an Horari
> instance.
>
> I'm wondering if I'm missing something, some magic provided by
> SubfieldBase that I've no replicated in the new class, or this is how
> it's supposed to work and I need to take care of this in the serializer.
>
>
> Here's the code for the field:
>
> class HorariField(models.CharField):
> description = _(u"Horari")
>
> def __init__(self, *args, **kwargs):
> if "max_length" not in kwargs:
> kwargs["max_length"] = 188
> if "default" not in kwargs:
> kwargs["default"] = None
> super(HorariField, self).__init__(*args, **kwargs)
>
> def get_internal_type(self):
> return "CharField"
>
> def from_db_value(self, value, expression, connection, context):
> if value is None:
> return None
> return horari.Horari(value)
>
> def to_python(self, value):
> if isinstance(value, horari.Horari):
> return value
> return horari.Horari(value)
>
> def get_prep_value(self, value):
> if value is None:
> return None
> return value.to_str()
>
> def formfield(self, form_class=fields.HorariField, **kwargs):
> return super(HorariField, self).formfield(form_class=form_class,
> **kwargs)
>
> I've tried defining the value_to_string method but I get the same error.
> The method it's never called. I assume that it's meant for django
> serializers' consumption.
>
> TIA
>
--
You received this message because you are subscribed to the Google Groups
"Django users" 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].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/7710ff9d-bee1-40d4-a71f-13f965a4b5b2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.