scurramalum
Янв. 2, 2015 13:17:36
Добрый день, очень прошу помочь с 1 проблемой.
Есть база данных интернет магазина. MS SQL. Таблицы были созданы программой 1С.
Дело в том, что в большинстве столбцов БД используются значения в формате
0x81D8000C764E053411D8A8180EE50080
Как вытащить это значение из БД в нормальном декодированном виде?
Желательно через Queryset.
Дело в том, что пытаясь обратиться через model.BinaryField (еще пробовал через Charfield и TextField), в итоге при обращению к данному свойству объекта Queryset выдает
<memory at 0x0000000003C324F8>
Никак не могу понять как его декодировать…
Огромная просьба писать более подробно, так как в этом деле новичок.
Искал в интернете, ничего похожего не нашел, такое чувство сложилось, что это элементарная фигня какая-то, которая до меня никак не доходит…
inoks
Янв. 2, 2015 16:32:13
Декодировать во что?
какая структура таблиц вашего магазина?
значение похоже на ключ 1С, по которому связываются таблицы там.
scurramalum
Янв. 2, 2015 16:41:02
Да, это структура 1С.
во вложении скрин.
Как видите, есть столбцы с ссылками на другие объекты (этой же таблицы), и столбец с ID самих объектов тоже в таком же формате. Притом что есть столбец, где просто стоят значения 1 или 0, однако в таблице мы видим 0х00 и 0х01.
Все эти значения - цифры, я пробовал каждое значение переводить так: int('значение', 16) в консоли, и мне выдавалось цифровое значение.
Однако как в джанго это сделать? Если я обращаюсь через класс модели, то мне при обращении к полю (к примеру _folder) выдается <memory at 0x0000000003C324F8>, однако если к полю _description, то выдается все нормально…
что я не так делаю или не доделываю? как вообще работать с такими значениями в бд как здесь?
scurramalum
Янв. 2, 2015 16:45:52
вообщем как видите, на скрине колонка _folder (на снимке все значение 0х00, однако там еще есть 0х01).
Как мне сделать фильтр по значению этой колонки через названиеМодели.objects.filter() ?
botinag
Янв. 2, 2015 18:37:32
_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') не работает?
scurramalum
Янв. 2, 2015 20:04:48
так и делал inspectdb.
определилось поле _Folder типа BinaryField.
Если оставить его как есть, то фильтрация по такому полю не поддерживается джанго.
Если поменять на Charfield, то такой фильтр YourModel.objects.filter(folder=u'0x00') выдает пустой список. Почему?
Такое чувство, что джанго сравнивая u'0x00' из фильтра со значениями в таблице БД не находит совпадения…
scurramalum
Янв. 2, 2015 20:11:21
Вот связь работает, Спасибо огромное, уже шаг вперед, он нормально определяет объект, на который указывает это значение. Но вот как сделать фильтрацию по полю _Folder ? какой тип у него должен быть?
Банальная задача блин, там всего 2 значения: 1 и 0, только вида 0х00 и 0х01, но джанго никак не хочет по ним искать…
botinag
Янв. 2, 2015 20:22:24
type(YourModel.objects.all()[0].folder)
что выдает?
и покажите ваш класс для этой таблицы в БД.
scurramalum
Янв. 2, 2015 20:54:43
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’>
botinag
Янв. 2, 2015 21:03:51
Сохраняем такой вариант.
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'
делаем
ребуатем сервак.
и еще раз просим показать:
type(Category.objects.all()[0].folder)