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

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

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

26 ответов

29 просмотров

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 Автор вопроса

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
50
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
я не понимаю mov [r11+8],rcx и прочие. мы записываем значение из rcx, куда?
Bor
15
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
А какие расширения активно используются в промышленности? Именно идейные, по типу гадт, а не всякие оверлоадедстрингс
Степан
11
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
Guys Who’s kurdish on this group?
Hiwa Amiri
11
Карта сайта