Django как отфильтровать объект внешнего ключа только по определенному значению
У меня есть две таблицы. Таблица Продукт
id | name |
Скидка на столик
id | product_id | is_deleted
Двумя моделями являются:
class Product(models.Model):
name = models.CharField(max_length=10)
class Discount(models.Modle):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
is_deleted = models.BooleanField(default=True)
product_id - внешний ключ id таблицы product, а is_deleted - булево поле.
Как я могу отфильтровать все продукты только с помощью скидки is_deleted? Обратите внимание, что эти две таблицы могут быть большими, поэтому .exclude()
не подходит для этого случая.
products = Product.objects.filter(discount__is_deleted=True)
product_ids_subquery = Discount.objects.values('product').annotate(
deleted=(Count('product') - Count('product', filter=Q(is_deleted=True)))
).filter(deleted=0).values('product')
products_qs = Product.objects.filter(id__in=product_ids_subquery)
мы можем определить, что продукты только с is_deleted скидкой с помощью count after group by product. Для каждого продукта,
- подсчитайте, сколько записей присутствует в таблице скидок. допустим, total_count = Count('product')
- подсчитайте, сколько записей присутствует в таблице скидок, которые удалены. пусть deleted_count = Count('product', filter=Q(is_deleted=True))
- deleted = (total_count - deleted_count) дает количество записей, которые не удалены
если deleted == 0, то можно сказать, что все сопоставленные записи удалены