Форум сайта python.su
1
Добрый день, очень прошу помочь с 1 проблемой.
Есть база данных интернет магазина. MS SQL. Таблицы были созданы программой 1С.
Дело в том, что в большинстве столбцов БД используются значения в формате
0x81D8000C764E053411D8A8180EE50080
Как вытащить это значение из БД в нормальном декодированном виде?
Желательно через Queryset.
Дело в том, что пытаясь обратиться через model.BinaryField (еще пробовал через Charfield и TextField), в итоге при обращению к данному свойству объекта Queryset выдает
<memory at 0x0000000003C324F8>
Никак не могу понять как его декодировать…
Огромная просьба писать более подробно, так как в этом деле новичок.
Искал в интернете, ничего похожего не нашел, такое чувство сложилось, что это элементарная фигня какая-то, которая до меня никак не доходит…
Отредактировано scurramalum (Янв. 2, 2015 16:26:26)
Офлайн
35
Декодировать во что?
какая структура таблиц вашего магазина?
значение похоже на ключ 1С, по которому связываются таблицы там.
Офлайн
1
Да, это структура 1С.
во вложении скрин.
Как видите, есть столбцы с ссылками на другие объекты (этой же таблицы), и столбец с ID самих объектов тоже в таком же формате. Притом что есть столбец, где просто стоят значения 1 или 0, однако в таблице мы видим 0х00 и 0х01.
Все эти значения - цифры, я пробовал каждое значение переводить так: int('значение', 16) в консоли, и мне выдавалось цифровое значение.
Однако как в джанго это сделать? Если я обращаюсь через класс модели, то мне при обращении к полю (к примеру _folder) выдается <memory at 0x0000000003C324F8>, однако если к полю _description, то выдается все нормально…
что я не так делаю или не доделываю? как вообще работать с такими значениями в бд как здесь?
Прикреплённый файлы:
2015-01-02 19-35-20 Скриншот экрана.png (274,4 KБ)
Офлайн
1
вообщем как видите, на скрине колонка _folder (на снимке все значение 0х00, однако там еще есть 0х01).
Как мне сделать фильтр по значению этой колонки через названиеМодели.objects.filter() ?
Офлайн
35
_IDRRef & _ParrentIDRRef = ForeignKey?
А зачем их переводить в шестандцатиричное представление?
Может стоит сделать
python mysite/manage.py inspectdb > mysite/myapp/TEMPmodels.py
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') ...
scurramalumYourModel.objects.filter(folder=u'0x00') не работает?
Как мне сделать фильтр по значению этой колонки через названиеМодели.objects.filter() ?
Офлайн
1
так и делал inspectdb.
определилось поле _Folder типа BinaryField.
Если оставить его как есть, то фильтрация по такому полю не поддерживается джанго.
Если поменять на Charfield, то такой фильтр YourModel.objects.filter(folder=u'0x00') выдает пустой список. Почему?
Такое чувство, что джанго сравнивая u'0x00' из фильтра со значениями в таблице БД не находит совпадения…
Офлайн
1
Вот связь работает, Спасибо огромное, уже шаг вперед, он нормально определяет объект, на который указывает это значение. Но вот как сделать фильтрацию по полю _Folder ? какой тип у него должен быть?
Банальная задача блин, там всего 2 значения: 1 и 0, только вида 0х00 и 0х01, но джанго никак не хочет по ним искать…
Офлайн
35
type(YourModel.objects.all()[0].folder)
Отредактировано botinag (Янв. 2, 2015 20:24:34)
Офлайн
1
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)
Офлайн
35
Сохраняем такой вариант.
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)
Офлайн