Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 2, 2015 13:17:36

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

django и hex значения в БД

Добрый день, очень прошу помочь с 1 проблемой.

Есть база данных интернет магазина. MS SQL. Таблицы были созданы программой 1С.
Дело в том, что в большинстве столбцов БД используются значения в формате
0x81D8000C764E053411D8A8180EE50080
Как вытащить это значение из БД в нормальном декодированном виде?

Желательно через Queryset.
Дело в том, что пытаясь обратиться через model.BinaryField (еще пробовал через Charfield и TextField), в итоге при обращению к данному свойству объекта Queryset выдает
<memory at 0x0000000003C324F8>

Никак не могу понять как его декодировать…

Огромная просьба писать более подробно, так как в этом деле новичок.

Искал в интернете, ничего похожего не нашел, такое чувство сложилось, что это элементарная фигня какая-то, которая до меня никак не доходит…

Отредактировано scurramalum (Янв. 2, 2015 16:26:26)

Офлайн

#2 Янв. 2, 2015 16:32:13

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

django и hex значения в БД

Декодировать во что?

какая структура таблиц вашего магазина?
значение похоже на ключ 1С, по которому связываются таблицы там.

Офлайн

#3 Янв. 2, 2015 16:41:02

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

django и hex значения в БД

Да, это структура 1С.

во вложении скрин.

Как видите, есть столбцы с ссылками на другие объекты (этой же таблицы), и столбец с ID самих объектов тоже в таком же формате. Притом что есть столбец, где просто стоят значения 1 или 0, однако в таблице мы видим 0х00 и 0х01.
Все эти значения - цифры, я пробовал каждое значение переводить так: int('значение', 16) в консоли, и мне выдавалось цифровое значение.
Однако как в джанго это сделать? Если я обращаюсь через класс модели, то мне при обращении к полю (к примеру _folder) выдается <memory at 0x0000000003C324F8>, однако если к полю _description, то выдается все нормально…

что я не так делаю или не доделываю? как вообще работать с такими значениями в бд как здесь?

Прикреплённый файлы:
attachment 2015-01-02 19-35-20 Скриншот экрана.png (274,4 KБ)

Офлайн

#4 Янв. 2, 2015 16:45:52

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

django и hex значения в БД

вообщем как видите, на скрине колонка _folder (на снимке все значение 0х00, однако там еще есть 0х01).
Как мне сделать фильтр по значению этой колонки через названиеМодели.objects.filter() ?

Офлайн

#5 Янв. 2, 2015 18:37:32

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

django и hex значения в БД

_IDRRef & _ParrentIDRRef = ForeignKey?
А зачем их переводить в шестандцатиричное представление?
Может стоит сделать

python mysite/manage.py inspectdb > mysite/myapp/TEMPmodels.py
Потом вручную заменить CharField для этих полей на ForeignKey и скопировать получившееся в файл к остальным моделям, типа такого:
class YourModel(models.Model):
    ref = models.ForeignKey(RefModel, db_column=u'_IDRRef')
    parrentref = models.ForeignKey(ParrentRefModel, db_column=u'_ParrentIDRRef')
    folder = models.CharField(max_length=50, db_column=u'_Folder')
...
scurramalum
Как мне сделать фильтр по значению этой колонки через названиеМодели.objects.filter() ?
YourModel.objects.filter(folder=u'0x00') не работает?

Офлайн

#6 Янв. 2, 2015 20:04:48

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

django и hex значения в БД

так и делал inspectdb.
определилось поле _Folder типа BinaryField.

Если оставить его как есть, то фильтрация по такому полю не поддерживается джанго.
Если поменять на Charfield, то такой фильтр YourModel.objects.filter(folder=u'0x00') выдает пустой список. Почему?

Такое чувство, что джанго сравнивая u'0x00' из фильтра со значениями в таблице БД не находит совпадения…

Офлайн

#7 Янв. 2, 2015 20:11:21

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

django и hex значения в БД

Вот связь работает, Спасибо огромное, уже шаг вперед, он нормально определяет объект, на который указывает это значение. Но вот как сделать фильтрацию по полю _Folder ? какой тип у него должен быть?

Банальная задача блин, там всего 2 значения: 1 и 0, только вида 0х00 и 0х01, но джанго никак не хочет по ним искать…

Офлайн

#8 Янв. 2, 2015 20:22:24

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

django и hex значения в БД

type(YourModel.objects.all()[0].folder)
что выдает?
и покажите ваш класс для этой таблицы в БД.

Отредактировано botinag (Янв. 2, 2015 20:24:34)

Офлайн

#9 Янв. 2, 2015 20:54:43

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

django и hex значения в БД

class Category(models.Model):

id = models.BinaryField(primary_key=True, null=False, db_column='_IDRRef')
folder = models.CharField(db_column='_Folder', max_length=150)
code = models.CharField(db_column='_Code', max_length=7)
description = models.CharField(db_column='_Description', max_length=150)
parentID = models.ForeignKey('self', db_column='_ParentIDRRef')
publish = models.BinaryField(db_column='_Fld306', blank=True, null=True)

class Meta:
managed = False
db_table = ‘_Reference23’


Класс модели (использую не все ее поля, из-за ненадобности). У folder ставил значение и CharField и BinaryField.

type(Category.objects.all().folder)
выдает
<class ‘memoryview’>

Отредактировано scurramalum (Янв. 2, 2015 20:55:29)

Офлайн

#10 Янв. 2, 2015 21:03:51

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

django и hex значения в БД

Сохраняем такой вариант.

class Category(models.Model):
    id = models.BinaryField(primary_key=True, null=False, db_column='_IDRRef')
    folder = models.CharField(db_column='_Folder', max_length=150)
    code = models.CharField(db_column='_Code', max_length=7)
    description = models.CharField(db_column='_Description', max_length=150)
    parentID = models.ForeignKey('self', db_column='_ParentIDRRef')
    publish = models.BinaryField(db_column='_Fld306', blank=True, null=True)
 
    class Meta:
        managed = False
        db_table = '_Reference23'
делаем
manage.py syncdb
ребуатем сервак.
и еще раз просим показать:
type(Category.objects.all()[0].folder)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version