bdoubleu
bdoubleu

Reputation: 6107

Prefetch nested through table

I'm trying to prefetch order lines grouped by product on a customer queryset. Is it possible to prefetch a through table using Django ORM or should I be going about this in a different way?

class Customer(models.Model):
    ...

class Order(models.Model):
    customer = models.ForeignKey(Customer, related_name='%(class)s_customer')
    lines = models.ManyToManyField(
        Product,
        through='OrderLine'
        through_fields=('order', 'product')
    )
    ...

class OrderLine(model.Model):
    product = models.ForeignKey(Product, related_name='%(class)s_product')
    order = models.ForeignKey(Order, related_name='%(class)s_order')

The following does not work because customer isn't a field on the OrderLine model

customers = Customer.objects.all().prefetch_related(
    Prefetch(
        'order_customer',
        queryset=OrderLine.objects.filter(**query),
        to_attr='order_lines'
        )
    )

Upvotes: 3

Views: 704

Answers (1)

Endre Both
Endre Both

Reputation: 5740

You can do a nested prefetch to get the related Orders and from there the related OrderLines:

customers = Customer.objects.prefetch_related(
    Prefetch(
        'order_customer',
        queryset=Order.objects.prefetch_related(Prefetch(
            'orderline_order',
            queryset=OrderLine.objects.filter(**query)
        ))
    )
)

Upvotes: 3

Related Questions