2013-09-21 3 views
0

Я фильтрация с помощью следующего запросаОбработка DB запросов и фильтрации Джанго и Unicode

list = AboutMe.objects.order_by('MyLinkedInLastName').filter(Q(MyGender__contains=Gender1)) 

Но это, кажется, не работает, когда я использую строку Юникода. Позволь мне объяснить. В таблице поле данных хранится как: [u'_M', u'_F'], например. И, например, выбор строки и поля другой записи может быть [u'_M]. Когда я убираю это в текст - то есть удаляю [] и показываю, что я получаю u'_M ', и я использую это как слово Gender1 в фильтре. Теперь это не работает. Но работает, если я жестко кодирую '_M' в фильтр. Я не понимаю, что происходит - есть ли здесь какое-то неявное преобразование?

Я получаю Gender1 от Gender1 = GenderField.split()[0].strip('[],')

Это, кажется, работает, однако

list = AboutMe.objects.order_by('MyLinkedInLastName').filter(Q(MyGender__contains='_M')) 

КСТАТИ Я упростил запрос для целей здесь. Кажется, это проблема с кодировкой. Каков наилучший способ сделать эту работу хорошо и надежно?

+0

Можете ли вы отправить sql-дамп первого запроса? – mariodev

ответ

0

Вы храните данные в виде строки, которая создается из представления списка Python. Это очень плохая идея.

Непосредственная проблема заключается в том, что даже когда у вас есть удалить [ символы и разделить на запятой, что вы не оставили являются строки"u'_M'" и "u'_F'" - то есть, u символов и открытие и закрытие котировки являются хранится как часть строки. Таким образом, это не «строка Unicode», как вы думаете, а просто строка, содержащая ведущий u, за которым следуют кавычки.

Вместо этого вы можете сохранить свой текст как JSON - в Django существуют различные реализации JSONFields, которые позаботятся о сериализации и десериализации данных для вас.

+0

Спасибо. После очистки данных существует дешевый/простой способ разобрать списки перед сохранением. Я стараюсь держать Django как ваниль, насколько это возможно, так как я не знаю, какова будет платформа (т. Е. Может быть Google App Engine). – disruptive

+0

Я действительно думал, что мой метод - это канонический способ сделать это. – disruptive

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