Проблема сериализации модели Django с полями по умолчанию - PullRequest
0 голосов
/ 05 ноября 2018

Внутри модели моего приложения я использую IntegerRangeField поля:

from django.db import models
from django.contrib.postgres.fields import IntegerRangeField
from django.contrib.postgres.validators import RangeMinValueValidator, RangeMaxValueValidator
from psycopg2.extras import NumericRange


class MyModel(models.Model):
    ...

    field = IntegerRangeField(default=NumericRange(400, 600), validators=[
        RangeMinValueValidator(1),
        RangeMaxValueValidator(1000)
    ])
    ...

Атрибуты " default " используются только в пользовательском интерфейсе панели администратора и больше нигде не нужны.

Если я добавлю их после миграции, они будут работать плавно. Однако, если я добавлю их до запуска makemigrations, я получу следующее сообщение:

ValueError: Невозможно сериализовать: NumericRange (400, 600, '[)') некоторые значения Django не может сериализовать в файлы миграции.

Я даже не хочу, чтобы значения по умолчанию были сохранены в моей базе данных PostgreSQL, я просто не хочу удалять и возвращать их каждый раз, когда я запускаю makemigrations.

Есть идеи?

(Не работало: пользовательский объект с атрибутами "нижний" и "высший", одно целое число, строка, кортеж)

Python: 3.6.6, Django: 2.1.2, PostgreSQL: 11.0

1 Ответ

0 голосов
/ 05 ноября 2018

Попробуйте переместить расчет значения по умолчанию в отдельную функцию:

def get_default_range():
    return NumericRange(400, 600)

class MyModel(models.Model):
    field = IntegerRangeField(default=get_default_range, validators=[
        RangeMinValueValidator(1),
        RangeMaxValueValidator(1000)
    ])

В этом случае миграция была успешно сгенерирована:

   operations = [
       migrations.AddField(
            model_name='comment',
            name='field',
            field=django.contrib.postgres.fields.ranges.IntegerRangeField(
                default=play.models.get_default_range,
                validators=[django.contrib.postgres.validators.RangeMinValueValidator(1),
                            django.contrib.postgres.validators.RangeMaxValueValidator(1000)]),
        ),
    ]
...