Найти - Пользователи
Полная версия: django и hex значения в БД
Начало » Django » django и hex значения в БД
1 2
scurramalum
Добрый день, очень прошу помочь с 1 проблемой.

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

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

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

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

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

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

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

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

что я не так делаю или не доделываю? как вообще работать с такими значениями в бд как здесь?
scurramalum
вообщем как видите, на скрине колонка _folder (на снимке все значение 0х00, однако там еще есть 0х01).
Как мне сделать фильтр по значению этой колонки через названиеМодели.objects.filter() ?
botinag
_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
так и делал inspectdb.
определилось поле _Folder типа BinaryField.

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

Такое чувство, что джанго сравнивая u'0x00' из фильтра со значениями в таблице БД не находит совпадения…
scurramalum
Вот связь работает, Спасибо огромное, уже шаг вперед, он нормально определяет объект, на который указывает это значение. Но вот как сделать фильтрацию по полю _Folder ? какой тип у него должен быть?

Банальная задача блин, там всего 2 значения: 1 и 0, только вида 0х00 и 0х01, но джанго никак не хочет по ним искать…
botinag
type(YourModel.objects.all()[0].folder)
что выдает?
и покажите ваш класс для этой таблицы в БД.
scurramalum
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
Сохраняем такой вариант.
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB