Django и PostgreSQL — слишком длинное значение для изменяющегося символа типа (512)

Я перехожу с тестовой базы данных SQLite на базу данных PostgreSQL.

У меня есть образец объекта, вставленный в базу данных, который работал на SQLite, но выдает ошибку в PostgreSQL.

Фрагмент кода:

car = CarItem.objects.create(
    user = motor_trend,
    name = 'Camaro 2010',
    category = cars,
    condition = 'Used',
    price = '28,547.00',
    production_year = '2010',
    color_interior = 'Black',
    color_exterior = 'Inferno Orange Metallic',
    reference = 'PRC17288',
    location_of_creation = 'Undisclosed',
    location_current = 'Columbus, OH, USA',
    description = 'GORGEOUS ORANGE SS!!',
)
car.save()

Я получаю:

DatabaseError at /create/
value too long for type character varying(512)

Traceback
(...)
    description = 'GORGEOUS ORANGE SS!!',
(...)

Поле описания моей модели имеет максимальную длину 512 символов:

description = models.CharField(max_length=512,default='')

Но не может быть, чтобы эта строка превышала 512 байт.

Я читал предыдущие сообщения об этой ошибке, один из которых относится к кодировке. Не похоже, что это так.

Я размещен на Webfaction. Я создал базу данных с кодировкой utf-8 и приступил к использованию syncdb. Syncdb работал отлично, но теперь вставка этого объекта не удалась.

Может ли кто-нибудь внести свой вклад? Спасибо.


person Community    schedule 07.01.2012    source источник


Ответы (1)


Немного покопавшись в документации по Django:

Поля символов

Любые поля, которые хранятся с типами столбцов VARCHAR, имеют максимальную длину ограниченную до 255 символов, если вы используете unique=True для поля.

Акцент мой. У вас есть unique=True для поля? Это ограничение Django, PostgreSQL не возражает. Возможно, вы захотите переключиться на тип данных text. TextField на языке Django.


Старые идеи:

user — это зарезервированное слово в PostgreSQL и любой стандарт SQL. Не используйте его в качестве имени столбца.

Вы можете использовать его, если заключите его в двойные кавычки, но держитесь подальше от этой глупости. Просто не используйте зарезервированные слова для идентификаторов. Всегда.

Также ...

user = motor_trend,
name = 'Camaro 2010',
category = cars,

По какой-то конкретной причине motor_trend и cars не указаны в кавычках, как другие значения? Внешние ключи, как прокомментировал @Ignacio?

person Erwin Brandstetter    schedule 07.01.2012
comment
Потому что это внешние ключи. И Django ORM, вероятно, правильно цитирует имена полей. - person Ignacio Vazquez-Abrams; 07.01.2012
comment
Да, это переменные Django, определенные ранее, некоторые строки, другие объекты. Однако связано ли это с проблемой описания? Является ли тот факт, что у меня есть пользовательское поле, причиной проблемы с описанием? - person ; 07.01.2012
comment
@VascoPatricio: Нет очевидной связи с проблемой, нет. Поскольку не было ничего очевидного, я искал что-нибудь подозрительное. Я копался в руководстве и думаю, что нашел что-то сейчас. Исправил мой ответ, посмотрите. - person Erwin Brandstetter; 07.01.2012
comment
Спасибо за совет. Имеет больше смысла использовать TextField, а не CharField для длинных текстовых полей. Я попробую это и доложу. - person ; 07.01.2012