Fixes #11046: Restrict length of indexed search values

This commit is contained in:
jeremystretch 2022-12-01 15:31:28 -05:00
parent d0e0c2ff8b
commit 2d49fc2521
2 changed files with 27 additions and 4 deletions

View File

@ -2,6 +2,8 @@ import sys
import uuid
import django.db.models.deletion
import django.db.models.functions.text
import django.db.models.lookups
from django.core import management
from django.db import migrations, models
@ -39,12 +41,16 @@ class Migration(migrations.Migration):
('object_id', models.PositiveBigIntegerField()),
('field', models.CharField(max_length=200)),
('type', models.CharField(max_length=30)),
('value', models.TextField(db_index=True)),
('value', models.TextField()),
('weight', models.PositiveSmallIntegerField(default=1000)),
('object_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='contenttypes.contenttype')),
],
options={
'ordering': ('weight', 'object_type', 'object_id'),
'indexes': (
models.Index(condition=models.Q(django.db.models.lookups.LessThan(django.db.models.functions.text.Length('value'), 1024)), fields=['value'], name='extras_cachedvalue_value'),
models.Index(condition=models.Q(django.db.models.lookups.LessThan(django.db.models.functions.text.Length('value'), 1024)), fields=['value'], name='extras_cachedvalue_value_like', opclasses=['text_pattern_ops']),
)
},
),
migrations.RunPython(

View File

@ -2,6 +2,9 @@ import uuid
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import Index, Q
from django.db.models.functions import Length
from django.db.models.lookups import LessThan
from utilities.fields import RestrictedGenericForeignKey
@ -9,6 +12,9 @@ __all__ = (
'CachedValue',
)
# Maximum cached value length to index (see #11046)
INDEX_MAX = 1024
class CachedValue(models.Model):
id = models.UUIDField(
@ -36,15 +42,26 @@ class CachedValue(models.Model):
type = models.CharField(
max_length=30
)
value = models.TextField(
db_index=True
)
value = models.TextField()
weight = models.PositiveSmallIntegerField(
default=1000
)
class Meta:
ordering = ('weight', 'object_type', 'object_id')
indexes = (
Index(
fields=['value'],
name='extras_cachedvalue_value',
condition=Q(LessThan(Length('value'), 1024))
),
Index(
fields=['value'],
name='extras_cachedvalue_value_like',
opclasses=['text_pattern_ops'],
condition=Q(LessThan(Length('value'), 1024))
),
)
def __str__(self):
return f'{self.object_type} {self.object_id}: {self.field}={self.value}'