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