Reputation: 1689
I have following models:
class Product(models.Model):
name = CharField(max_length=30)
class Store(models.Model):
name = CharField(max_length=30)
product = models.ManyToManyField(Product)
How to get Store
s with product named product_name
and also, get all the products (except the product with name product_name
) ? Is it possible to make it in one query?
In raw SQL it would be simple JOIN
s. Not sure how to implement it via Django.
Upvotes: 16
Views: 35602
Reputation: 27861
You can actually do these things with Django due to it's lazy queryset evaluation. Django's in
field lookup accepts both lists and querysets. The following will create a nested SQL code:
products = Product.objects.filter(store_set__in=stores_qs)
stores_qs = Store.objects.filter(product__name='product_name')
Here are the Django in
docs.
Upvotes: 26
Reputation: 1040
Get Stores with product named "product_name" :
Store.objects.filter(product__name='product_name')
Get all the products except the product with name "product_name":
Product.objects.exclude(name='product_name')
Upvotes: 2
Reputation: 6272
You should be able to filter the stores based on an attribute of Product, and then prefetch_related of the retrieved objects.
Store.objects.filter(product__name="product_name").prefetch_related('product')
This should hit the database the fewest times to achieve what you are looking for - twice.
Further documentation can be found here.
Upvotes: 9