Добрый день.
Задавал вопрос тут (http://python.su/forum/topic/26370/?page=1#post-141109). Может поможет кто на этом форуме...
Ситуация такая.
Есть 2 модели:
class GenCats(models.Model):
class Meta():
managed = False
db_table = 'GenCats'
...
code = models.IntegerField(db_column='Code')
name = models.CharField(max_length=150, db_column='Name')
...
class GoodsFolders(models.Model):
class Meta():
managed = False
db_table = 'GoodsFolders'
...
code = models.CharField(max_length=10, db_column='Code')
name = models.CharField(max_length=150, db_column='Name')
parent = models.ForeignKey('self', db_column='ParentID_Ref', related_name='parentCat', db_index=True)
gen_cat = models.ForeignKey(GenCats, db_column='GenCatID_Ref', related_name='mainCat', db_index=True)
Во views.py делаю запрос:
catalog = GenCats.objects.using('1C').prefetch_related('mainCat__parentCat__parentCat')
В шаблоне вывожу таким образом:
<ul>
{% for category in Catalog %}
<li>{{ category.name }}</li>
<ul style="padding-left: 20px">
{% for cats in category.mainCat.all %}
<li>{{ cats.name }}</li>
<ul style="padding-left: 20px">
{% for subCats in cats.parentCat.all %}
<li>{{ subCats.name }}</li>
<ul style="padding-left: 30px">
{% for lastCat in subCats.parentCat.all %}
<li>{{ lastCat.name }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
{% endfor %}
</ul>
{% endfor %}
</ul>
Если я правильно понимаю, то такой вывод в шаблоне аналогичен коду в питоне:
catalog = GenCats.objects.using('1C').prefetch_related('mainCat__parentCat__parentCat')
for i in catalog:
print(i.name)
sub = i.mainCat.all()
for j in sub:
print(j.name)
sub2 = j.parentCat.all()
for k in sub2:
print(k.name)
sub3 = k.parentCat.all()
В итоге образуется 4 запроса общей длительностью около 0.7с. (Учитывая, что первоначально получалось вывести не меньше чем за 20с, то уже результат неплохой)
Но может есть возможность еще улучшить скорость обработки?
Дело в том, что в базе данных MSSQL созданы 2 представления, с которыми и работают эти модели. Ключ в этих представлениях в виде "0x9b1e001a4b0aa5ab11e4b8ffe2e60877", тип данных binary(16). И если работать с этими данными напрямую - то в питон загружается объект memoryview и он ничего не хочет с ним делать...Поэтому пришлось сделать представление и с помощью БД отдавать это значение в виде строки.
Пояснение по таблицам: есть маленькая таблица GenCats с начальными категориями, на них ссылаются несколько значений из таблицы GoodsFolders, у которых parent = 0x00, в свою очередь на них ссылаются еще объекты GoodsFolders у которых уже mainCat = null.
Вопрос: как ускорить выгрузку этих данных и чтобы удобно было разобрать их в шаблоне?
PS
ну и маленький вопрос не по теме, вдруг кто сталкивался с работой с 1С через COMConnector. Как сделать постоянное подключение к базе данных, и чтобы все пользователи могли им пользоваться? (там по сути вызов 1 функции не так часто будет, но чтоб при обращении к этой функции не создавалось подключение заного...). Я пробовал делать это через общую модель (http://python.su/forum/topic/26286/), но почему то при повторном обращении к функции - выдет ошибку, что подключение разорвано...
Заранее спасибо всем за любую помощь.
Updated 23 Feb. 2015, 16:14 by ust.