docs читать:
Использовать OuterRef, когда набор запросов в подзапросе должен ссылаться на поле из внешнего запроса.
соответствующий пример :
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))
Это модель Comment
, которая имеет ForeignKey для модели Post
, а newest
собирает все Comments
, связанные с каждым Post
, и сортирует их от самых последних к самым старым.
Из этого Subquery
выбирается столбец email
, и первая строка извлекается в атрибут newest_commenter
для каждого Post
в запросе.
Следовательно, в вашем примере, предполагая, что Order
имеет ForeignKey для Album
, вы можете сделать что-то вроде:
orders = Order.objects.filter(album=OuterRef('pk'), user=request.user, status='P')
models.Album.objects.annotate(purchased_status=Subquery(orders.values('id')[:1]))
Таким образом, для каждого Album
вы получите атрибут purchased_status
, который будет содержать id
первого Order
, если текущий пользователь сделал хотя бы один Order
со статусом P
.