Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 21, 2015 14:53:03

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

связанные модели

Добрый вечер.

Есть 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)

Как получить все значения минимумом запросов?

Пробовал так:
catalog = GenCats.objects.select_related('mainCat', 'parentCat')

После вывожу в шаблоне (как пример):
{% for main in Catalog %}
        {{ main.code }}<br>
        {{ main.name }}<br>
        {% for subCat in main.mainCat.all %}
        ----> {{ subCat.code }} ---- > {{ subCat.name }}<br>
            {% for subCat2 in subCat.parentCat.all %}
                >>>>>>>> {{ subCat2.code }} >>>>>>>> > {{ subCat2.name }}<br>
                {% for subCat3 in subCat2.parentCat.all %}
                    ------------------------------------> {{ subCat2.code }} >>>>>>>> > {{ subCat2.name }}<br>
                {% endfor %}
            {% endfor %}
        {% endfor %}
        <hr>
    {% endfor %}

Но как показали тесты, постоянно порождаются новые запросы. И все это происходит неприлично долго…

Помогите разобраться, как вообще принято выводить такую структуру? (необходимо получить все модели GenCats и связанные с ними GoodsFolders, и конечно всех потомков модели GoodsFolders и их потомков….)


PS
да забыл сказать, что у модели GoodsFolders может быть либо parent либо gen_cat, одновременно 2 значения быть не может (там Null). Вообщем структура такая: несколько GenCats, к каждой из которых привязано несколько GoodsFolders, к которым в свою очередь тоже привязано несколько GoodsFolders, и к ним так же привязано несколько GoodsFolders

Отредактировано scurramalum (Фев. 21, 2015 14:59:09)

Офлайн

#2 Фев. 21, 2015 18:31:02

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

связанные модели

Если написать запрос типа:

catalog = GenCats.objects.using('1C').select_related('mainCat').values('id' ,'name', 'code', 'mainCat__code', 'mainCat__name', 'mainCat__parentCat__code', 'mainCat__parentCat__name', 'mainCat__parentCat__parentCat__code', 'mainCat__parentCat__parentCat__name',)

то получается быстрый запрос….правда как с его ответом работать в шаблоне - ума не приложу. Результат - массив словарей, количество их = количеству всех подразделов…

Офлайн

#3 Фев. 21, 2015 20:00:01

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

связанные модели

Всем спасибо за внимание, проблему решил. Решение:

В представлении:

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>

В итоге создается всего 8 запросов, уже не плохо…

Если вдруг есть решение быстрее, проще и элегантнее - прошу напишите, очень интересно!

Отредактировано scurramalum (Фев. 22, 2015 08:57:28)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version