Tengo una tabla de clientes y una tabla de pedidos de clientes como se muestra a continuación.
class Customer(models.Model): name = models.CharField() class CustomerOder(models.Model): customer = models.ForiengKey(Customer) item = models.CharField() datetime_of_purchase = models.DateField()Ejemplo de entrada de la base de datos
Tabla: Cliente
id name 1 A 2 B 3 CTabla: Pedido de cliente
id customer item datetime_of_purchase 1 A item_3 2021-11-10 10:00:00 2 A item_2 2021-11-11 10:00:00 3 B item_1 2021-11-11 10:00:00 4 A item_1 2021-11-12 10:00:00 5 B item_2 2021-11-12 10:00:00 6 C item_1 2021-11-13 10:00:00Supongamos que necesito filtrar el cliente cuya última compra es 'artículos_1', por lo que la muestra después del filtrado debería obtener solo el Cliente 'A' y 'C' cuya última compra es 'artículo_1'
Sample: <QuerySet [<Customer: A>, <Customer: C>]>Puede obtener el último elemento adquirido con una expresión de Subquery [Django-doc] :
from django.db.models import OuterRef, Subquery Customer.objects.alias( latest_purchase=Subquery( CustomerOrder.objects.filter( customer_id=OuterRef('pk') ).order_by('-datetime_of_purchase').values('item')[:1] ) ).filter( latest_purchase='item_1' ) Antes de django-3.2 , se usa .annotate(…) [Django-doc] sobre .alias(…) [Django-doc] :
from django.db.models import OuterRef, Subquery Customer.objects.annotate( latest_purchase=Subquery( CustomerOrder.objects.filter( customer_id=OuterRef('pk') ).order_by('-datetime_of_purchase').values('item')[:1] ) ).filter( latest_purchase='item_1' )