How to Query model where name contains any word in python list?

后端 未结 3 1964
故里飘歌
故里飘歌 2020-12-23 17:02

Aim to Achieve:

I want all objects where name attribute contains any word from the list.

I have:

list = [\'word1\',\'word2\',\'word3\']
ob_li         


        
相关标签:
3条回答
  • 2020-12-23 17:14
    obj_list = [obj for obj in data.objects.all() if any(name in obj.name for name in list)]
    

    Edit: Just re-read your question. Don't know if you can do that with filter but you can do it with a list comprehension or generator expression.

    0 讨论(0)
  • 2020-12-23 17:20

    You could use Q objects to constuct a query like this:

    from django.db.models import Q
    
    ob_list = data.objects.filter(reduce(lambda x, y: x | y, [Q(name__contains=word) for word in list]))
    

    Edit:

    reduce(lambda x, y: x | y, [Q(name__contains=word) for word in list]))
    

    is a fancy way to write

    Q(name__contains=list[0]) | Q(name__contains=list[1]) | ... | Q(name__contains=list[-1])
    

    You could also use an explicit for loop to construct the Q object.

    0 讨论(0)
  • 2020-12-23 17:36
    ob_list = data.objects.filter(name__in=my_list)
    

    And BTW, avoid using the variable name "list" (Or any other python standard keyword), lest you get into some weird bugs later.

    Update: (I guess your question was updated too, because when I wrote the answer, I didn't see the part where you wrote you need a contains match and not an exact match)

    You can do that using the regex search too, avoiding many Q expressions (which end up using that many where "and" clauses in the SQL, possibly dampening the performance), as follows:

    data.objects.filter(name__regex=r'(word1|word2|word3)')
    
    0 讨论(0)
提交回复
热议问题