【发布时间】:2021-09-15 05:59:37
【问题描述】:
假设我有一个Product 模型和一个一对多的ProductTag 模型。
class Product(models.Model):
[...]
class ProductTag(models.Model):
product = models.ForeignKey(Product)
tag_value = models.CharField()
[...]
如果我有 3 个带有一些标签的产品:
- 产品A [TagA]
- 产品B [标签B]
- 产品C [TagB/TagC]
我想动态查询带有一些标签的“产品”。
- 此查询仅返回“ProductA”(如预期的那样)。
Product.objects.filter(Q(producttag__tag_value="TagA"))
- 此查询返回所有 3 种产品(如预期的那样)。
Product.objects.filter(
Q(producttag__tag_value="TagA") | Q(producttag__tag_value="TagB")
)
- 我希望以下查询只返回“ProductC”
Product.objects.filter(
Q(producttag__tag_value="TagB") & Q(producttag__tag_value="TagC")
)
但是我得到一个空的查询集。为什么查询 #3 不起作用?
使用__in 查询也会返回错误结果(如预期)
Product.objects.filter(producttag__tag_value__in=["TagB", "TagC"])
上述查询同时返回 ProductB / ProductC。
更新
我使用 Q 对象进行查找的原因是查询基于来自 API 端点的用户输入。例如
- "tag=TagA"
- "tag=TagA AND tag=TagB"
- "tag=TagA AND NOT tag=TagC"
所以我需要根据用户输入运行动态 Django 查询,并且无法对某些查询进行硬编码。
【问题讨论】:
-
查询#3 有效地要求
ProductTag.tag_value在单行上同时等于TagB和TagC,这显然是不可能的。我得到了您想要实现的目标,但仍在考虑可能的解决方案。这是 SQL 模型的结果,您总是根据表的单行进行过滤...
标签: python django django-models django-queryset