Opened 3 years ago
Last modified 21 months ago
#34059 closed New feature
Validation of check constraints on postgres json fields produce invalid SQL — at Initial Version
| Reported by: | Dan LaManna | Owned by: | |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 4.1 |
| Severity: | Normal | Keywords: | |
| Cc: | David Sanders | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
Given a model with constraints within the JSONField:
class Version(models.Model):
metadata = models.JSONField(blank=True, default=dict)
class Meta:
constraints = [
models.CheckConstraint(
name='version_metadata_has_schema_version',
check=~Q(metadata__schemaVersion=None),
)
]
The following code produces an error:
version = Version(metadata={'foo': 'bar'})
version.validate_constraints()
WARNING Got a database error calling check() on <Q: (AND: (NOT (AND: ('metadata__schemaVersion', None))))>: operator is not unique: unknown -> unknown
LINE 1: SELECT 1 AS "_check" WHERE NOT (('{"foo": "bar"}' -> 'schema...
^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts
Internally it's running the following query:
SELECT 1 AS "_check"
WHERE NOT (('{"foo": "bar"}' -> 'schemaVersion') = 'null')
This appears similar to https://code.djangoproject.com/ticket/33905.
Note:
See TracTickets
for help on using tickets.