【问题标题】:Django models queryset with arrayDjango 使用数组建模查询集
【发布时间】:2014-02-17 15:27:30
【问题描述】:

我想创建一个函数,它会返回名称包含一些文本的应用程序。

假设我们有以下模型:

class Application(models.Model):
    name = models.CharField(max_lenght=100)

Example values: "T2 AAA", "T2 BBB", "FSA KK" etc.

现在我想写一个函数,如果这个函数的属性是 AAA,它应该返回给我应用程序 T2 AAA:

def getApplication(request, title):
    titleVars = title.split(' ')
    applications = Application.objects.filter(name__in=titleVars)

老实说,我不知道该怎么做,我认为我应该使用icontains,但我不知道它如何应用于数组titleVars

示例执行:

getApplication(request, 'Some text whatever T2 AAA XXX/K')

提前致谢

【问题讨论】:

  • name__in 不起作用?
  • 也许使用Q()
  • name_in 不起作用,因为我们正在检查“T2 AAA”是否在数组 ["T2", "AAA"] 中。 @Alex,但我应该如何使用它?
  • 提示 - 我认为您正在寻找类似搜索。

标签: python django django-models django-queryset


【解决方案1】:

我认为您正在寻找类似的搜索。

使用Q() -

from django.db.models import Q

obj_list = Application.objects.filter(reduce(lambda x, y: x | y, [Q(name__contains=word) for word in titleVars]))

这是推荐的方式。

其他选项 -

您可以使用 django-like(参考 - answer)来做到这一点:

Application.objects.filter(name__like=titleVars[1])

另一种方法是您可以循环遍历您的数组项,并进行正则表达式检查。

【讨论】:

  • 我会检查第一个答案。第二个不是我要找的,循环遍历数组不是一个好主意。
  • 是的,推荐 Q() 一个。
  • @Silwestpl- 解决方案好运吗?
  • 这几乎是一个很好的答案,但问题是当我写“T2 AAA”时,它会找到 T2 AAA、T2 BBB、T2 CCC 等:(
  • 是的,你是对的,但关键是我只想找到与第二部分 AAA 匹配的应用程序,我想我会从数组中删除 t2 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多