所以我和Django合作的时间并不长。我遇到了一个问题,通过传入的数组字符串的确切名称来过滤查询集。目前,我正在通过图标过滤查询集,这是有效的。例如,当前的实现是这样的:如果我传入一个名为"test“的字符串,我的查询集将被过滤,并显示带有"test1”、"test2“和"test3”标签的交易。这不是我想要的。我想按传入的字符串的确切名称进行筛选。因此,如果我有一个"test“作为字符串之一,那么我的查询集将只搜索test,而不是其中包含的任何内容。我尝试过多种实现,比如从图标切换到iexact和exact。
目标。按多个标签数组过滤查询集。
旧查询: values是一个传入的标记(字符串)数组
values = value.replace(" ", "").split(",")
return qs.filter(reduce(operator.or_, (Q(tags__iontains=item) for item in values)))我试过的方法:我试着用下面的值列表传入iexact。我还试着只传递iexact,然后从数组中只传递一个硬编码的字符串。当我只传入一个带有iexact的字符串时,我会遇到这样的错误:“Unsupported lookup '‘for ArrayField or join on the field not array”,这是有意义的,因为这是一个数组。
values = value.replace(" ", "").split(",")
return qs.filter(reduce(operator.or_, (Q(tags__iexact=item) for item in values)))有没有人遇到过这个问题,并知道解决方法?我一直在阅读文档和堆栈溢出,但没有找到解决方案。
发布于 2021-07-08 08:30:07
假设这是特定于PostgreSQL的ArrayField -这看起来像overlap查找。也就是说,假设您想要任何指定值的结果。如果您希望结果中包含所有指定值,则为contains。
从文档中:
overlap
Returns objects where the data shares any results with the values passed. Uses the SQL operator &&. For example:
>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])
>>> Post.objects.filter(tags__overlap=['thoughts']) <QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__overlap=['thoughts', 'tutorial']) <QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>
>>> Post.objects.filter(tags__contains=['thoughts']) <QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__contains=['django']) <QuerySet [<Post: First post>, <Post: Third post>]>
>>> Post.objects.filter(tags__contains=['django', 'thoughts']) <QuerySet [<Post: First post>]>https://stackoverflow.com/questions/68294069
复制相似问题