Size: a a a

Django [ru] #STAY HOME

2020 October 11

SP

Sergey Python in Django [ru] #STAY HOME
еще не понимаю почему у меня не отрабатывает .filter(tags__isnull=True) Вместо .all() в 56-строке...
источник

SP

Sergey Python in Django [ru] #STAY HOME
но это вроде ограничение ORMа - тип если префетч - то всегда all()
источник

SP

Sergey Python in Django [ru] #STAY HOME
вот кста первый варик - он генерит тучу селектов...и даже на небольшом количестве постов/тегов - хуже почти в 10 раз по времени...
PS - т.е. тут просто пересекаю кверисеты в приложении. и смотрю сколько общих тегов...
источник

SP

Sergey Python in Django [ru] #STAY HOME
с Prefetch - всего 3 запроса.
источник

S

Shodmon in Django [ru] #STAY HOME
Sergey Python
Count(tags) просто число тегов у поста. Не интересует. Нужна сортировка по числу ОБЩИХ тегов...а это вычисляемое(но не через аннотацию, а через агрегацию в Prefetch) поле...
t = list(self.tags.all().values_list('id', flat=True)) Posts.objects.prefetch_related().annotate(tc=Count('tags')).filter(tc=similarity, tags__pk__in=t)?

Хз с синтаксисом
источник

SP

Sergey Python in Django [ru] #STAY HOME
не. тут надо сначала суть понять...а потом запрос писать...
источник

SP

Sergey Python in Django [ru] #STAY HOME
пустой префетч что должен сделать?
источник

{

{^~^} in Django [ru] #STAY HOME
Sergey Python
вот кста первый варик - он генерит тучу селектов...и даже на небольшом количестве постов/тегов - хуже почти в 10 раз по времени...
PS - т.е. тут просто пересекаю кверисеты в приложении. и смотрю сколько общих тегов...
Всегда можно переписать на более эффективную plain query
источник

SP

Sergey Python in Django [ru] #STAY HOME
Shodmon
t = list(self.tags.all().values_list('id', flat=True)) Posts.objects.prefetch_related().annotate(tc=Count('tags')).filter(tc=similarity, tags__pk__in=t)?

Хз с синтаксисом
далее - проверять на равенство tc=similarity нет смысла. Нужно(в аннотации, или в сортировке...) кол-во ОБЩИХ тегов. А не всех тегов.
источник

S

Shodmon in Django [ru] #STAY HOME
Sergey Python
не. тут надо сначала суть понять...а потом запрос писать...
Ты хочешь получить количество пересекающихся тегов с тегами данного поста, верно? ну и симиларити ?
источник

SP

Sergey Python in Django [ru] #STAY HOME
получаю. Это len(p.same_tags) в строке 58(скрин выше)
источник

SP

Sergey Python in Django [ru] #STAY HOME
и сравниваю.
источник

T

Tema in Django [ru] #STAY HOME
Есть вопрос.
Имеется страница с "all products" на сайте. Слева будут представлены ссылки на прокту по категориям.
Как реализовать такую штуку как фильтр по категориям?? Как сделать такое, ты нажимаешь на "категория А" и считывается что ты хочешь опреденную категорию и вставляется на страницу темплейта и (наверное) заменяется содержимое "all products" на "products category A"
источник

SP

Sergey Python in Django [ru] #STAY HOME
Этот метод работает, конечно можно оптимизировать дальше. Но щас вопрос про второй метод. Т.е.  вернуть эн постов наиболее похожих на данный - т.е. допустим у self записи 10 тегов. И я хочу найти 5 постов наиболее похожих на данный. у самого похожего будет 4 общих тега, у второго допустим тоже 4, дальше 3,3,3,3,2,2,1,1,1,1,0,0,0...вот это хочу сделать...
источник

SP

Sergey Python in Django [ru] #STAY HOME
аннотация с Count(m2m) не работает...
источник

SP

Sergey Python in Django [ru] #STAY HOME
поэтому думал решить через Prefetch - префетчить только общие теги а уже в приложении их считать,  или сортировать...Да, через sorted можно сделать. Но не хочу.
источник

SP

Sergey Python in Django [ru] #STAY HOME
у m2m есть метод _get_target_ids()  - множество id связанных моделей, но чет даже вызвать его не смог...хотел аннотировать.
источник

SP

Sergey Python in Django [ru] #STAY HOME
Shodmon
t = list(self.tags.all().values_list('id', flat=True)) Posts.objects.prefetch_related().annotate(tc=Count('tags')).filter(tc=similarity, tags__pk__in=t)?

Хз с синтаксисом
да, сейчас это проверю. Сначала не понял.
источник

S

Shodmon in Django [ru] #STAY HOME
Кстати, такое

qs = self.__class__.objects.prefetch_related(
           Prefetch(
               lookup='tags',
               queryset=Tag.objects.filter(pk__in=self.tags.all()),
               to_attr='same_tags')
       ).annotate(c=Count('same_tags')).filter(c=similarly)

Выдаст ли для первого то что нужно?
источник

SP

Sergey Python in Django [ru] #STAY HOME
но это тоже "первая" задача
источник