我与类别和产品有一对多的关系,类别和产品有活动的字段,如果它们中的任何一个不活动,我想从列表中排除它们。
categories = Category.objects.filter(is_active=True)
但是现在类别可以有许多产品,其中一些是非活动的,我如何从所有类别中过滤和排除非活动的产品?
型号:
class Category(MPTTModel):
name = models.CharField(max_length=50, blank=False, unique=True)
is_active = models.BooleanField(default=True)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children', db_index=True)
class Product(models.Model):
name = models.CharField(max_length=50, blank=False, unique=True)
is_active = models.BooleanField(default=True)
category = TreeForeignKey('Category', on_delete=models.CASCADE, null=True, blank=True, db_index=True)
发布于 2018-02-28 11:59:27
如果你需要过滤相关的产品,你可以使用带有Prefetch
对象的prefetc_related
:
from django.db.models import Prefetch
categories = Category.objects.filter(is_active=True).prefetch_related(Prefetch('product_set', queryset=Produc.objects.filter(is_active=True)))
在本例中,对于来自categories
的每个类别,此代码
category.product_set.all()
将只返回激活的产品。此外,这个查询集不会命中DB,因为第一个查询将缓存相关产品。
https://stackoverflow.com/questions/49028854
复制