首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >筛选多对一关系,在条件下排除孩子

筛选多对一关系,在条件下排除孩子
EN

Stack Overflow用户
提问于 2018-02-28 19:47:50
回答 1查看 58关注 0票数 2

我与类别和产品有一对多的关系,类别和产品有活动的字段,如果它们中的任何一个不活动,我想从列表中排除它们。

代码语言:javascript
代码运行次数:0
运行
复制
categories = Category.objects.filter(is_active=True)

但是现在类别可以有许多产品,其中一些是非活动的,我如何从所有类别中过滤和排除非活动的产品?

型号:

代码语言:javascript
代码运行次数:0
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 19:59:27

如果你需要过滤相关的产品,你可以使用带有Prefetch对象的prefetc_related

代码语言:javascript
代码运行次数:0
运行
复制
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的每个类别,此代码

代码语言:javascript
代码运行次数:0
运行
复制
category.product_set.all()

将只返回激活的产品。此外,这个查询集不会命中DB,因为第一个查询将缓存相关产品。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49028854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档