Opened 10 years ago
Last modified 10 years ago
#25143 closed Bug
ArrayField should implement from_db_value() — at Initial Version
| 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
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
But 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.
Note:
See TracTickets
for help on using tickets.