Django 如何只过滤具有特定值的外键对象

Django how to filter a foreign key object only with specific value

我有两个 table。 Table 产品

id | name | 

Table折扣

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是商品table的id的外键,is_deleted是boolean字段。 我如何才能筛选出仅具有 is_deleted 折扣的所有产品?请注意,这两个 table 可能很大,因此 .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 折扣的产品。对于每个产品,

  1. 计算折扣中有多少条记录table。假设 total_count = Count('product')
  2. 计算存在多少条被删除的记录。假设 deleted_count = Count('product', filter=Q(is_deleted=True))
  3. deleted = (total_count - deleted_count) 给你一个否定。未删除

如果删除 == 0 那么你可以说所有映射记录都被删除