我有一个简单的模型:
class Place(models.Model):
name = models.CharField()
它有一些代表性的名称,如Starbucks
,McDonald'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查询?
提前致谢。
答案 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
。