ФорумПрограммированиеPythonDjango → Связи в моделях

Связи в моделях

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 ноября 2015 г. 10:34, спустя 1 минуту 4 секунды

    Ставьте в nginx кеш на час, а то и сутки, и похую на количество запросов и их кривизну :)

    @mathete, для html динамического? )))) нихуя у вас методы )))

    Сапожник без сапог
  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 9 ноября 2015 г. 7:19, спустя 5 дней 20 часов 44 минуты

    Смех смехом, а в результате у меня получилось по 400 запросов на страницу ))) Я оптимизировал это безобразие с помощью select_related, но для множественных связей как я понял надо использовать prefetch_related и тут у меня возникла проблема. В модель картинок я добавляю related_name для связи. Получается так

    
    class CatalogElements(models.Model):
        name = model.CharField()
    
    class CatalogImages(models.Model):
        element = model.ForeignKey('CatalogElements', related_name='images')
        src = model.CharField()
    

    Далее пытаюсь получить элемент и картинки к нему

    
    element = CatalogElement.objects.select_related(не множественные связи других моделей).prefetch_related('images').get(pk=1)
    

    если я правильно понял, после этого я могу обращаться к картинкам через element.images, но оно возвращает catalog.CatalogImages.None
    Я посмотрел лог запросов и там видно что делается дополнительный запрос в таблицу и извлекаются нужные изображения, но почему-то они недоступны из объекта element. Что я делаю не так?

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 ноября 2015 г. 7:29, спустя 10 минут 6 секунд

    @Crank, хз, вот не поленился и выполнил твои запросы

    In [10]: CatalogElements.objects.prefetch_related('images').filter(pk=1)
    DEBUG 2015-11-09 06:29:13,263 utils 6514 139692681328448 (0.000) SELECT "products_catalogelements"."id", "products_catalogelements"."name" FROM "products_catalogelements" WHERE "products_catalogelements"."id" = 1 LIMIT 21; args=(1,)
    DEBUG 2015-11-09 06:29:13,264 utils 6514 139692681328448 (0.000) SELECT "products_catalogimages"."id", "products_catalogimages"."element_id", "products_catalogimages"."src" FROM "products_catalogimages" WHERE "products_catalogimages"."element_id" IN (1); args=(1,)
    

    и

    In [11]: CatalogElements.objects.prefetch_related('images').get(pk=1)
    DEBUG 2015-11-09 06:30:35,429 utils 6514 139692681328448 (0.000) SELECT "products_catalogelements"."id", "products_catalogelements"."name" FROM "products_catalogelements" WHERE "products_catalogelements"."id" = 1; args=(1,)
    DEBUG 2015-11-09 06:30:35,431 utils 6514 139692681328448 (0.000) SELECT "products_catalogimages"."id", "products_catalogimages"."element_id", "products_catalogimages"."src" FROM "products_catalogimages" WHERE "products_catalogimages"."element_id" IN (1); args=(1,)
    

    Спустя 140 сек.

    Убери select_related, может они мешают, дебаж? В общем доку почитай, сорцы посмотри, я всегда так делаю

    adw/0
  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 9 ноября 2015 г. 8:29, спустя 1 час 8 секунд

    @adw0rd, не помогло. Вроде все по докам делаю, но что-то не так. Буду искать примеры.

  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 9 ноября 2015 г. 8:37, спустя 7 минут 31 секунду

    @adw0rd, кароче удалось победить проблему заданием to_attr через Prefetch('catalogimages_set', to_attr='images'). Хуй знает почему без него не работало.

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 ноября 2015 г. 8:45, спустя 8 минут 1 секунду

    ну и дерьмо ж, жанга гавно, все, перехожу на perl

    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 ноября 2015 г. 8:49, спустя 4 минуты 16 секунд

    @Crank, что за версия жанги?

    adw/0
  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 9 ноября 2015 г. 8:52, спустя 3 минуты 1 секунду

    @adw0rd, 1.8.5

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 ноября 2015 г. 8:58, спустя 6 минут 15 секунд

    @Crank, у меня такая же

    adw/0
  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 15 декабря 2015 г. 10:46, спустя 36 дней 1 час 48 минут

    Вот еще вопросик по Aggregation созрел

  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 15 декабря 2015 г. 10:52, спустя 5 минут 37 секунд

    Есть 2 модели

    
    class Parent(models.Model) {
       #...
    }
    
    class Children(models.Model) { 
       parent = models.ForeignKey(Parent)
       data_type = models.CharField(choices=('A', 'B'))
    }
    

    Я хочу получить список Parents с посчитанным колличеством соответствующих Children по типам A и В
    тоесть тапа такого:
    Parent1: A(5), B(0)
    Parent2: A(1), B(3)
    Parent3: A(0), B(12)

    Прочитал что это делается через aggregate, но что-то никак не могу вкурить как правильно построить запрос.

  • Sinkler

    Сообщения: 8083 Репутация: N Группа: в ухо

    Spritz 15 декабря 2015 г. 11:26, спустя 34 минуты 5 секунд

    @Crank, вот тут смотри последний пример Агрегация — Документация Django 1.8 [djbook.ru]

    # Each publisher, each with a count of books as a "num_books" attribute.
    >>> from django.db.models import Count
    >>> pubs = Publisher.objects.annotate(num_books=Count('book'))
    >>> pubs
    [<Publisher BaloneyPress>, <Publisher SalamiPress>, ...]
    >>> pubs[0].num_books

    ну а чтобы для А и B отдельно посчитать, то только двумя запросами, как здесь ответили

    Django conditional annotation [stackoverflow.com]

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 декабря 2015 г. 11:40, спустя 13 минут 21 секунду

    annotate да

    Сапожник без сапог
  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 15 декабря 2015 г. 13:44, спустя 2 часа 4 минуты 4 секунды

    @phpdude, вот я лупоглаз, спасибо

    Спустя 75 сек.

    @Sinkler, спс

Пожалуйста, авторизуйтесь, чтобы написать комментарий!