django - 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)
解决方案
您需要“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
推荐阅读
- arrays - Route中的数组到字符串转换
- java - 无法从 CLASSPATH 导入 log4j
- node.js - 函数内部中间件的 Sinon Stub
- javascript - A-Frame - Raycast Three.JS 3D 对象
- ruby - 如何执行 savon client.call 使用带有有效负载的 GET 请求而不是 POST?
- database - 如何从条目/行中的“项目”中检索条目/行的“id”?
- zsh - 在 shell 函数中睡眠 inotifywait 不起作用
- excel - 如何在由类动态创建的组合框上使用 ComboBox_Change() - VBA
- python - 从熊猫数据框创建表
- android - 项目 API 19 之间的 Recyclerview 差距