﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
29391	Postgres array lookups need to call get_db_prep_value to adapt values to their db representation (FieldGetDbPrepValueMixin)	Gavin Wahl	vinay karanam	"I have have a model that has an ArrayField of objects that need to be adapted to database values (EnumField from https://github.com/hzdg/django-enumfields).

The custom array lookups in django.contrib.postgres.arrays are not correctly calling the base fields get_db_prep_value/get_prep_value before passing the objects to the db api.

Repro:

{{{#!python
import enum

from django.db import models
from django.contrib.postgres.fields import ArrayField


class TestEnum(enum.Enum):
    VALUE_1 = 'value_1'


class EnumField(models.CharField):
    def get_prep_value(self, value):
        if value is None:
            return None
        else:
            return value.value


class TestModel(models.Model):
    array_of_enums = ArrayField(EnumField(max_length=20))


TestModel.objects.filter(array_of_enums__contains=[TestEnum.VALUE_1])
}}}

Currently this fails with:

{{{
Traceback (most recent call last):
  File ""django/db/backends/utils.py"", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: can't adapt type 'TestEnum'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File ""<console>"", line 1, in <module>
  File ""django/db/models/query.py"", line 226, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File ""django/db/models/query.py"", line 250, in __iter__
    self._fetch_all()
  File ""django/db/models/query.py"", line 1118, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File ""django/db/models/query.py"", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File ""django/db/models/sql/compiler.py"", line 899, in execute_sql
    raise original_exception
  File ""django/db/models/sql/compiler.py"", line 889, in execute_sql
    cursor.execute(sql, params)
  File ""django/db/backends/utils.py"", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File ""django/db/backends/utils.py"", line 64, in execute
    return self.cursor.execute(sql, params)
  File ""django/db/utils.py"", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File ""django/utils/six.py"", line 685, in reraise
    raise value.with_traceback(tb)
  File ""django/db/backends/utils.py"", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: can't adapt type 'TestEnum'
}}}

I expect it to succeed and generate a WHERE clause of `array_of_enums @> ARRAY['value_1']`.

I think the fix is just to have the lookups inherit from `FieldGetDbPrepValueMixin`.
"	Bug	closed	contrib.postgres	2.0	Normal	fixed			Accepted	1	0	0	0	0	0
