我有一个父模型目录及其子模型产品和产品的子模型选项。 目录和产品的关系是OneToOne,产品和选项的关系是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
到目前为止,我尝试过的是
该查询在没有或声明的情况下正常工作
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)
答案 0 :(得分:1)
您需要“ 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