Как в Django models задать для поля varchar признак binary?

214 просмотра
0
0 Комментариев

Вот такая конструкция:

sbSorterTree = models.CharField(
    max_length=64,
    blank=True,
    default=""
    unique=False,
    db_index=True,
    verbose_name=u"Сортировщик деревьев",
    help_text=u"Служебное поле"
)

Создает вот такое поле:

sbSorterTree varchar(64) NOT NULL

а нужно чтобы создало:

sbSorterTree varchar(64) BINARY NOT NULL

Как такое сделать? Собственно задача сделать чтобы индекс по полю строился по принципу текстового поля (т.е. «124» в сортировке раньше «89») и в него можно было записывать произвольные символы (даже нечитаемые) и регистр не влиял на сортировку.


Добавить комментарий

2 Answers

Python Опубликовано 18.12.2018
0

Напишите собственное поле

class BinaryCharField(models.CharField):
    def db_type(self, connection):
        return super(BinaryCharField, self).db_type(connection) + ' binary'
 
sbSorterTree = models.BinaryCharField(
    # ...
)

В результате получается sql:

ADD COLUMN "test" varchar(64) binary;

То есть цель достигнута

Добавить комментарий
0

Добавленное в модель ExampleTable поле sbSorterTree

class ExampleTable(models.Model):
    sbSorterTree = models.CharField(max_length=64, blank=True, default="", unique=False, db_index=True, verbose_name=u"Сортировщик деревьев", help_text=u"Служебное поле")
    class Meta:
        db_table = 'example_table'

создает такую миграцию:

class Migration(migrations.Migration):
 
    dependencies = [
        ...
    ]
 
    operations = [
        migrations.CreateModel(
            name='ExampleTable',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('sbSorterTree', models.CharField(blank=True, db_index=True, default='', help_text='Служебное поле', max_length=64, verbose_name='Сортировщик деревьев')),
            ],
            options={
                'db_table': 'example_table',
            },
        ),
    ]

и такой sql:

BEGIN;
--
-- Create model ExampleTable
--
CREATE TABLE `example_table` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `sbSorterTree` varchar(64) NOT NULL);
CREATE INDEX `example_table_479ea2e4` ON `example_table` (`sbSorterTree`);
 
COMMIT;

Вы можете добавить RunSQL команду в файл миграций и промигрировать, пример:

class Migration(migrations.Migration):
 
    dependencies = [
        ...
    ]
 
    operations = [
        migrations.CreateModel(
            name='ExampleTable',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('sbSorterTree', models.CharField(blank=True, db_index=True, default='', help_text='Служебное поле', max_length=64, verbose_name='Сортировщик деревьев')),
            ],
            options={
                'db_table': 'example_table',
            },
        ),
        migrations.RunSQL("ALTER TABLE example_table MODIFY COLUMN sbSorterTree varchar(64) BINARY NOT NULL;"),
    ]

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up