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. Для каждого продукта,

  1. подсчитайте, сколько записей присутствует в таблице скидок. допустим, total_count = Count('product')
  2. подсчитайте, сколько записей присутствует в таблице скидок, которые удалены. пусть deleted_count = Count('product', filter=Q(is_deleted=True))
  3. deleted = (total_count - deleted_count) дает количество записей, которые не удалены

если deleted == 0, то можно сказать, что все сопоставленные записи удалены

Вернуться на верх