170 похожих чатов

Смотри, если не поймёшь, то я сдаюсь🙃 Я чувак, и ко

мне приходят товары, много товаров, приходят товары в пакетах (не важно, сколько товаров хранит в себе пакет, если в пакете П1 товар А и Б, то в данный момент для товаров актуальный пакет П1)
Один и тот же товар может прийти ко мне сколько угодно раз
Тобишь, если он пришёл несколько раз, то и пакетов вскрытых (в нужном статусе)
у меня много (значит может товар А прийти в П2 и товар Б в П3 или они придут в пакете П4 все вместе), то если товар А пришел в П2, то последний пакет для товара А какой? Правильно, П2, значит запись, где товар А был в П1 мне уже не актуальна, если товар Б пришел в П3, то ласт пакет для товара Б какой? Правильно, П3, П2 мне уже не актуален по аналогии с другим вариантом, надеюсь ты понял🙏)
И вот мне надо сделать выборку всех товаров, у которых последний пакет находится в нужном мне статусе))

26 ответов

33 просмотра

Products.objects.annotate( latest_package_in_needed_status=Subquery( Package.objects.filter(status=your_status, products=OuterRef('id')).order_by('-id').values_list('id', flat=True)[:1] ) ).filter( latest_package_in_needed_status__isnull=False ).values_list('latest_package_in_needed_status', flat=True)

Yaroslav-Savchuk Автор вопроса
Bohdan Konovalenko
Products.objects.annotate( latest_package_in_n...

оно получается возвращает по-очереди последний пакет с нужным статусом у меня есть два пакета с одним и тем же товаром А, П1 пришел раньше чем П2, значит П2 это последний пакет для товара А Оба пакета у меня лежат в нужном статусе и запрос возвращает последний пакет — П2 Но если я П2, последнему пакету, сделаю не нужный мне статус, то этот товар не должен попасть в кверисет, а он попадает, так как возвращает предыдущий (П1) пакет в нужном мне статусе, а надо бы в таком случае такой товар скипать и проверять следующий(

Yaroslav Savchuk
оно получается возвращает по-очереди последний пак...

Ну тут надо тогда проверять еще есть ли пакет с этим товаром у которого айдишник больше чем у того что с нужным статусом

Yaroslav Savchuk
в сабквери?

Оставь эту затею, тут что-то рекурсивное надо писать) на орм не получится

Pavel Aksenov
Оставь эту затею, тут что-то рекурсивное надо писа...

если результаты аннотаций можно сравнивать то получится

Yaroslav Savchuk
оно получается возвращает по-очереди последний пак...

вопрос не чилтал, возможно вместо сабквери можено использовать префетч релейтид с объектом префетч, так можно префетчить больше одного значения и отфильтровать их

Yaroslav Savchuk
оно получается возвращает по-очереди последний пак...

Product.objects.annotate( latest_package_in_needed_status_id=Subquery( Package.objects.filter(products=OuterRef('id'), status=your_status).order_by('-id').values_list('id', flat=True)[:1] ), latest_package_id=Subquery( Package.objects.filter(products=OuterRef('id')).order_by('-id').values_list('id', flat=True)[:1] ) ).filter( latest_package_in_needed_status_id__isnull=False, latest_package_id__isnull=False, latest_package_in_needed_status_id=F('latest_package_id') ).values_list('latest_package_in_needed_status_id', flat=True) выглядит конечно стремно но вот к чему я пришел

Yaroslav-Savchuk Автор вопроса

да, ща, после ормки))

Yaroslav Savchuk
да, ща, после ормки))

Это трата времени на орм) и на попытку такое написать на sql

Pavel Aksenov
Это трата времени на орм) и на попытку такое напис...

чем мой последний варик с орм неправильный?

Bohdan Konovalenko
чем мой последний варик с орм неправильный?

Сек, гляну его с компа, а то с телефона код смотреть тяжело) только критиковать с него могу)

Yaroslav-Savchuk Автор вопроса
Bohdan Konovalenko
Product.objects.annotate( latest_package_in_ne...

Пушка, это работает🙏🙏🙏

Yaroslav-Savchuk Автор вопроса
Yaroslav Savchuk
Пушка, это работает🙏🙏🙏

нашел решение оптимизированное Product.objects.annotate( latest_package_in_needed_status_id=Subquery( Package.objects.filter(products=OuterRef('id'), status=your_status).order_by('-id').values_list('id', flat=True)[:1] ), ).prefetch_related( Prefetch('packages', queryset=Package.objects.order_by('-id')[:1]), ).filter( packages__isnull=False, latest_package_in_needed_status_id__isnull=False, packages=F('latest_package_in_needed_status_id') ).values_list('latest_package_in_needed_status_id', flat=True)

Yaroslav-Savchuk Автор вопроса
Bohdan Konovalenko
Ошибка?(

ага Cannot filter a query once a slice has been taken.

Yaroslav-Savchuk Автор вопроса
Bohdan Konovalenko
Ошибка?(

а, мне ж надо вернуть объекты продуктов, а в запросе твоем .values_list('latest_package_in_needed_status_id')

Yaroslav-Savchuk Автор вопроса

тут я валью лист делитнул и оно робит норм а тут с префетчем не дружит

Yaroslav Savchuk
тут я валью лист делитнул и оно робит норм а тут ...

Без вальюс листа не работает к сожалению да, жаль

Yaroslav-Savchuk Автор вопроса
Bohdan Konovalenko
Product.objects.annotate( latest_package_in_ne...

вот только не мог понять, latest_package_in_needed_status_id и latest_package_id — это ж объекты пакетов а что значит latest_package_in_needed_status_id__isnull=False?

Yaroslav-Savchuk Автор вопроса
Bohdan Konovalenko
Product.objects.annotate( latest_package_in_ne...

пытаюсь перевести на человеческий язык, и получается: аннотируем переменную для сбора нужного последнего пакета с нужным статусом по айди товара — latest_package_in_needed_status_id аннотируем переменную latest_package_id чтобы вогнать туда только ласт пакет (не смотря на статус) по айди товара а вот потом что в фильтрах происходит? и правильно ли я понял запрос?

Yaroslav Savchuk
пытаюсь перевести на человеческий язык, и получает...

Правильно а в фильтрах я смотрю что вообще есть пакеты с таким продуктом, что есть пакеты с таким продуктом и нужным статусом и потом сравниваю что последний пакет с нужным статусом это последний пакет для этого продукта

Yaroslav-Savchuk Автор вопроса

Похожие вопросы

Обсуждают сегодня

Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
А какие чаты вообще в ходу? Auto aim? И что еше
do you think you're better off alone? А
13
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Какой дос блять?
007
9
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Коллеги, а в чём сейчас хорошо писать на перле, в смысле ide? Пробовал в идее с плагином, подсветка есть, даже какие-то предупреждения есть, но рефакторинга считай нет. Перене...
Дмитрий Петров
9
Карта сайта