2015-12-08 3 views
1

Я использую PostgreSQL с Django и пытается использоватьArrayField возвращает неправильное значение

ArrayField(CharField()) 

Ни хранящие значения, ни при получении поднимает какие-либо исключения, но attepmting хранить ["string", "another_string", "string with whitespaces", "str"] и затем получить возвращает

'{string,another_string,"string with whitespaces",str}' 

Эта проблема не возникает при использовании ArrayField(IntegerField()) или ArrayField(ArrayField(CharField()))

Хотя я знаю, что могу просто использовать JSON или nes t список в другом списке, чтобы получить [[строки]], которые будут правильно прочитаны, я хотел бы знать, почему это происходит.


EDIT: Как выясняется, используя ArrayField(ArrayField(CharField())) не работает либо:

Python 3.3.2 (default, Mar 20 2014, 20:25:51) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from api.models import Game 
>>> g = Game.objects.all()[0] 
>>> g.p1hand = [["a", "b", "c d"]] 
>>> g.p1hand 
[['a', 'b', 'c d']] 
>>> g.save() 
>>> g = Game.objects.all()[0] 
>>> g.p1hand 
'{{a,b,"c d"}}' 
>>> 

Я понятия не имею, почему это работает в одном экземпляре ArrayField(ArrayField(CharField()))


EDIT: Что касается @LongBeard_Boldy, это то, что возвращает другой экземпляр ArrayField(ArrayField(CharField())):

>>> g.game_objects 
[['Test', '3', '3', '0', 'building', '5', '2', '2', '0'], ....] 
+1

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

+0

извините, если не являетесь человеком-джанго, вы должны импортировать postgres contrib? «как из django.contrib.postgres.fields импортировать ArrayField» http://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields или http://www.craigkerstiens.com/2012/11/06/django-and-arrays/ –

+0

@LongBeard_Boldy Я импортирую его так. Нет никакого ArrayField, включенного в django.db.models – Mirac7

ответ

1

У меня была такая же проблема, и это оказалось проблемой с миграциями. Я включил это поле в файл models.py, но я не мигрировал, поэтому django понимал, как обрабатывать списки, но не как их извлекать.

Как только я перенес базу данных, все работает отлично.

+0

Я уверен, что я выполнил миграцию базы данных, но я не могу попробовать решение в качестве своего проблемного кода, поскольку он больше не существует. Однако, если мне удастся воспроизвести проблему в отдельном тестовом примере, я буду отмечать это как правильный ответ. – Mirac7

Смежные вопросы