Reputation: 6107
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
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