我正在try 根据用户输入标签查询数据库.标记的数量可以从0到5,所以我需要动态创建查询.

因此,我有一个标记列表TAG_LIST,并且我想查询数据库:

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

如何创建此功能?

推荐答案

你需要在标签列表中循环,并 for each 标签应用一个过滤器.

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

这将为您提供与all个标签匹配的结果,如您的示例中的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)

我测试了一下,它似乎工作得很好.

Edit 2:把最初的 idea 归功于#Django on Freenode中的kezabelle.

Django相关问答推荐

管理器不能通过对象上的对象实例访问.保存()

Django 中模型将数据存储在哪里?

Django:创建一个动态侧边栏模板并在其他模板中使用它

组织大型 Django 元素的指南

如何使用 matplotlib 在绘图的角落插入小图像?

Django PositiveIntegerField 中的 0 值?

文档中的 Mongoengine creation_time 属性

Python / Django 中的 Unicode 与 UTF-8 混淆?

测试 Django ModelForm 是否有实例

无法通过 pip 安装 Django 2.0

Python 和 Django OperationalError (2006, 'MySQL server has gone away')

Django - 如何从模型中 Select 特定列?

__init__() 得到了一个意外的关键字参数user

现在如何在 Django 中处理每个对象的权限?

如何在 django 中分离我的模型?

响应发送到客户端后在 Django 中执行代码

如何在 django 中捕获UNIQUE constraint failed404

Django:DoesNotExist从何而来?

Django中reverse()和reverse_lazy()的区别

ImportError:没有名为 django_filters 的模块