【问题标题】:How to filter Charfiled by List of Tags in Django ORM如何在 Django ORM 中按标签列表过滤 Charfiled
【发布时间】:2019-02-04 17:57:53
【问题描述】:

使用标签列表过滤 CharField 的首选方法是什么? 在数据库中我有这样的东西:

genres = "something, apple ,something_else ,something_else2, orange, grape, more.."

我尝试使用 __in 运算符没有任何结果

elem = list(Elements.objects.filter(genres__in=['apple','orange','grape']))

【问题讨论】:

  • 在字符字段中,您将标签存储为单个字符串。但__in 可用于对象列表。
  • 那我需要做什么?沙菲库尔·拉赫曼
  • 更好的标签解决方案在这里stackoverflow.com/questions/31632947/…

标签: python django django-models


【解决方案1】:

你可以试试这个查询

elem = list(Elements.objects.filter(Q(genres__icontains="apple") | Q(genres__icontains="orange") | Q(genres__icontains="grape")))

但我认为对于标签来说这是一个更好的解决方案Django Filtering A Blog Based on Tags

【讨论】:

  • 刚刚更改或“|”用 AND “&”谢谢你 Shafikur Ra​​hman 你是救生员,但我想知道如何在一行代码中实现这一点,因为我有 30 个标签来过滤 ^_^
【解决方案2】:

您可能希望使用 Q 查找。 https://docs.djangoproject.com/en/2.1/topics/db/queries/#complex-lookups-with-q-objects

from django.db.models import Q

elem = Elements.objects.filter(Q(genres__icontains="apple") | Q(genres__icontains="orange") | Q(genres__icontains="grapes"))

【讨论】:

    【解决方案3】:

    我能够得到我想要做的事情:

    from django.db.models import Q
    from functools import reduce
    from operator import and_
    
    tag_list = ['apple', 'orange', 'grape']
    
    query = reduce(and_, (Q(genres__icontains=tag) for tag in tag_list))
    elem = list(Elements.objects.filter(query))
    

    您也可以使用or_ 运算符查看:

    How to dynamically compose an OR query filter in Django?'

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 2010-11-04
      • 2020-10-23
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多