用Q对象动态过滤Django

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我试图根据用户输入标签查询数据库。标签的数量可以是0-5,所以我需要动态创建查询。

所以我有一个标签列表,标签_列表,我想查询数据库:

design_list = Design.objects.filter(Q(tags__tag__contains = "tag1") and Q(tags__tag__contains = "tag2") and etc. etc. )

如何创建此功能?

提问于
用户回答回答于

你会想要循环通过标记_列出并为每个过滤器应用筛选器。

tag_list = ['tag1', 'tag2', 'tag3']
base_qs = Design.objects.all()
for t in tag_list:
    base_qs = base_qs.filter(tags__tag__contains=t)

这将提供结果匹配。标记,如你的示例所示and...。如果你真的需要or相反,可能需要q对象。

tags = ['tag1', 'tag2', 'tag3']
q_objects = Q() # Create an empty Q object to start with
for t in tags:
    q_objects |= Q(tags__tag__contains=t) # 'or' the Q objects together

designs = Design.objects.filter(q_objects)

我对此进行了测试,它似乎运行得很好。

用户回答回答于

先准备一个标签列表,然后查询如下:

tags = ['tag1', 'tag2',...]
design_list = Design.objects.filter(tags__tag__contains__in = tags)

扫码关注云+社区