The following fails with Django 2.2.6 but works with Django 1.11.x.
Did filter() of JSONfield change in 2.2.6 and the query needs to change, or
could this be a bug?
Goal:
Select model rows where the related AbstractService.EntityJSON contents
“Capability" list includes the value 'data.transfer.nonstriped'
Given: EntityJSON field contains "Capability": ["data.transfer.striped",
"data.transfer.nonstriped"],
Executing:
objects =
Endpoint.objects.filter(AbstractService__EntityJSON__Capability__contains=['data.transfer.nonstriped’])
serializernonstriped = xdinfo_gridftpn_Serializer(objects, many=True)
len(serializernonstriped.data)
Failes like this:
(Pdb) n
>
/soft/python-pipenv/python-201910-zz_fwp56/lib/python3.7/site-packages/django/contrib/postgres/lookups.py(11)as_sql()
-> params = lhs_params + rhs_params
(Pdb) n
TypeError: can only concatenate tuple (not "list") to tuple
>
/soft/python-pipenv/python-201910-zz_fwp56/lib/python3.7/site-packages/django/contrib/postgres/lookups.py(11)as_sql()
-> params = lhs_params + rhs_params
(Pdb) l
6
7 class PostgresSimpleLookup(Lookup):
8 def as_sql(self, qn, connection):
9 lhs, lhs_params = self.process_lhs(qn, connection)
10 rhs, rhs_params = self.process_rhs(qn, connection)
11 ->params = lhs_params + rhs_params
12 return '%s %s %s' % (lhs, self.operator, rhs), params
13
14
15 class DataContains(PostgresSimpleLookup):
16 lookup_name = 'contains'
(Pdb) lhs, lhs_params
('("glue2_db_abstractservice"."EntityJSON" -> %s)', ('Capability',))
(Pdb) rhs, rhs_params
('%s', [])
Models:
class AbstractGlue2EntityModel(models.Model):
ID = models.CharField(primary_key=True, max_length=200)
Name = models.CharField(max_length=128, null=True)
CreationTime = models.DateTimeField()
Validity = models.DurationField(null=True)
EntityJSON = JSONField()
class Meta:
abstract = True
db_name = 'glue2'
def __str__(self):
return str(self.ID)
class AbstractService(AbstractGlue2EntityModel):
ResourceID = models.CharField(db_index=True, max_length=40)
ServiceType = models.CharField(max_length=32)
Type = models.CharField(max_length=32)
QualityLevel = models.CharField(max_length=16, null=True)
class Endpoint(AbstractGlue2EntityModel):
ResourceID = models.CharField(db_index=True, max_length=40)
AbstractService = models.ForeignKey(AbstractService,
related_name='endpoints',
on_delete=models.CASCADE,
null=True)
HealthState = models.CharField(max_length=16)
ServingState = models.CharField(max_length=16)
URL = models.CharField(max_length=320)
QualityLevel = models.CharField(max_length=16, null=True)
InterfaceVersion = models.CharField(max_length=16)
InterfaceName = models.CharField(max_length=32)
--
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 django-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/2ded869b-4706-47f7-aba3-f6c290ccb719%40googlegroups.com.