Opened 9 years ago

Last modified 8 years ago

#25143 closed Bug

ArrayField should implement from_db_value() — at Version 1

Reported by: Odahi Owned by:
Component: contrib.postgres Version: 1.8
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description (last modified by Odahi)

I'm using a custom field with the new Postgres ArrayField:

class Tag(object):
   def __init__(self, id):
        self.id = id

   def __unicode__(self):
        return U"Tag(%d)" % self.id


class TagField(models.SmallIntegerField):
    # Dummy wrapper over SmallIntegerField.

   def from_db_value(self, value, expression, connection, context):
        if value is None:
            return value
        return Tag(int(value))

   def get_prep_value(self, value):
        return value
   ...

# models.py

class Recommendation(models.Model):
    tags = ArrayField(TagField(), size=3)

    def __unicode__(self):
        return self.tags

Then

>>> Recommendation.objects.create(tags=[Tag(1), Tag(2)])
>>> Recommendation.objects.all()

[<Recommendation: [1, 2]>]  # WRONG

This is wrong because I got Integers instead of Tag objects:

[<Recommendation: [Tag(1), Tag(2)]>]  # OK

Looking at the ArrayField source code seems that to_python() is implemented but never called. I think from_db_value() should be also implemented.

Change History (1)

comment:1 by Odahi, 9 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top