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 折扣的产品。对于每个产品,
- 计算折扣中有多少条记录table。假设 total_count = Count('product')
- 计算存在多少条被删除的记录。假设 deleted_count = Count('product', filter=Q(is_deleted=True))
- deleted = (total_count - deleted_count) 给你一个否定。未删除
如果删除 == 0 那么你可以说所有映射记录都被删除
我有两个 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 折扣的产品。对于每个产品,
- 计算折扣中有多少条记录table。假设 total_count = Count('product')
- 计算存在多少条被删除的记录。假设 deleted_count = Count('product', filter=Q(is_deleted=True))
- deleted = (total_count - deleted_count) 给你一个否定。未删除
如果删除 == 0 那么你可以说所有映射记录都被删除