首页 > 解决方案 > Django 1.9 如何用 or 语句过滤孩子的孩子模型?

问题描述

我有一个父模型目录及其子模型产品和产品的子模型选项。Catalog 和 Product 的关系是 OneToOne 并且 Product 和 Options 的关系是 OneToMany

我想过滤选项之一是否满足条件,返回目录模型

这是我下面的代码

class Catalog(models.Model):
    product = models.ForeignKey(models.Product)

class Product(models.Model):
    objects = ProductManager()

class ProductOptions(models.Model):
    product = models.ForeignKey(Product, related_name = 'options')

class ProductManager(models.Manager):
    def get_queryset(self):
        queryset = super(ProductManager, self).get_queryset()
        queryset = queryset.prefetch_related('options')
        return queryset

到目前为止我尝试过的是

此查询在没有 or 语句的情况下工作正常

catalog_query = models.Catalog.objects.all()
catalog_query = catalog_query.filter(product__options__date=datetime(2018,10,24)

但是当我输入或声明时,它会返回重复的目录数据

catalog_query = models.Catalog.objects.all()
catalog_query = catalog_query.filter(product__options__date=datetime(2018,10,24) | catalog_query.filter(product__quantity_limit=True)

标签: djangodjango-models

解决方案


您需要“Q 对象”: https ://docs.djangoproject.com/pl/2.1/topics/db/queries/#complex-lookups-with-q-objects

文档中的示例:

Q(question__startswith='Who') | Q(question__startswith='What')

所以你的例子看起来像这样:

from django.db.models import Q

catalog_query = catalog_query.filter(
    Q(product__options__date=datetime(2018,10,24))
    | Q(catalog_query.filter(product__quantity_limit=True))

在查询集上使用“.distinct()”删除重复项:

https://docs.djangoproject.com/pl/2.1/ref/models/querysets/#django.db.models.query.QuerySet.distinct


推荐阅读