Consider the following condition:
class Book(models.Model):
name = models.CharField(max_length=300)
price = models.IntegerField(default=0)
def __str__(self):
return self.name
class Store(models.Model):
name = models.CharField(max_length=300)
default = models.BooleanField(default=False)
books = models.ForeignKey(Book, on_delete=models.CASCADE)
So, for this query:
Book.objects.prefetch_related(Prefetch('store_set',
queryset=Store.objects.filter(default=False)))
.values("store__name", "name", "store__default")
The SQL query is not considering queryset default=True condition
SELECT "core_store"."name",
"core_book"."name",
"core_store"."default"
FROM "core_book"
LEFT OUTER JOIN "core_store"
ON ("core_book"."id" = "core_store"."books_id")
Result:
<QuerySet [{'store__name': 'Subway Store', 'name': 'Hello', 'store__default': False},
{'store__name': 'Times Square', 'name': 'Hello', 'store__default': False},
{'store__name': 'Subway Store', 'name': 'GoodBye', 'store__default': True},
{'store__name': 'Times Square', 'name': 'GoodBye', 'store__default': False},
{'store__name': 'Subway Store', 'name': 'Greetings', 'store__default': True},
{'store__name': 'Subway Store', 'name': 'HateWords', 'store__default': False}]>
I want to have a query set condition while prefetching the query. I am not able to find any way to do it in one query or a minimum number of queries.
I was thinking it should make a where condition with the OUTER JOIN with core_store table. Here
LEFT OUTER JOIN "core_store"
ON ("core_book"."id" = "core_store"."books_id")