代码之家  ›  专栏  ›  技术社区  ›  akwataip

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

  •  3
  • akwataip  · 技术社区  · 6 年前

    我有一个简单的模型:

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

    它有一些代表性的名字,比如 Starbucks ,则, McDonald's 等,如下所示。

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

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

    • 星巴克派克广场
    • 麦当劳沙湖路
    • 另一家星巴克

    我试图实现的是筛选/获得适当的 Place 具有给定参数的对象,确定它是否具有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 回复  |  直到 6 年前
        1
  •  3
  •   wim    6 年前

    我想我已经找到了一种可怕的方法,可以在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'))
    
        2
  •  0
  •   theunraveler    6 年前

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