Django:通过“参数具有字段值的一部分”来过滤查询集?

时间:2018-04-03 04:05:35

标签: python django django-queryset

我有一个简单的模型:

class Place(models.Model):
    name = models.CharField()

它有一些代表性的名称,如StarbucksMcDonald's等,如下所示。

 id |   name   
----+----------
  1 | Starbucks
  2 | McDonald's
  3 | ...  

我还有一些地名作为查询参数,例如:

  • 星巴克派克广场
  • 麦当劳沙湖路
  • 另一个星巴克在那里

我想要实现的是使用给定参数过滤/获取适当的Place对象,确定它是否具有地方name的一部分。

如何使用django的QuerySet API执行此操作? 检查过参考文献和论坛,找到类似下面的内容,但没有运气:

Place.objects.get(name__ispartof=PARAM)
# or
Place.objects.get(PARAM__contains=Q('name'))

在Postgres中,我的案例可能相当于:

SELECT id FROM table
WHERE 'Starbucks Pike Place' LIKE CONCAT('%', name, '%')

我是否必须为此执行raw() SQL查询?

提前致谢。

2 个答案:

答案 0 :(得分:3)

我认为我在ORM中找到了一种可怕的方法,无需原始SQL。希望其他人能够找到更好的东西。

from django.db.models import ExpressionWrapper, CharField, Value, F

param = 'Starbucks Pike Place'
myparam = ExpressionWrapper(Value(param), output_field=CharField())
Place.objects.annotate(param=myparam).filter(param__contains=F('username'))

答案 1 :(得分:0)

Place.objects.get(name__contains=PARAM)应该这样做。请注意,如果您希望查询不区分大小写,也可以使用icontains代替contains