sql “LIKE” equivalent in django query

前端 未结 5 1249
星月不相逢
星月不相逢 2020-12-13 05:19

What is the equivalent of this SQL statement in django?

SELECT * FROM table_name WHERE string LIKE pattern;

How do I implement this in djan

相关标签:
5条回答
  • 2020-12-13 05:44

    Use __contains or __icontains (case-insensitive):

    result = table.objects.filter(string__contains='pattern')
    

    The SQL equivalent is

    SELECT ... WHERE string LIKE '%pattern%';
    
    0 讨论(0)
  • 2020-12-13 05:44

    This can be done with Django's custom lookups. I have made the lookup into a Django-like-lookup application. After installing it the __like lookup with the % and _ wildcards will be enabled.

    All the necessary code in the application is:

    from django.db.models import Lookup
    from django.db.models.fields import Field
    
    
    @Field.register_lookup
    class Like(Lookup):
        lookup_name = 'like'
    
        def as_sql(self, compiler, connection):
            lhs, lhs_params = self.process_lhs(compiler, connection)
            rhs, rhs_params = self.process_rhs(compiler, connection)
            params = lhs_params + rhs_params
            return '%s LIKE %s' % (lhs, rhs), params
    
    0 讨论(0)
  • 2020-12-13 05:49
    result = table.objects.filter(string__icontains='pattern')
    

    Case insensitive search for string in a field.

    0 讨论(0)
  • 2020-12-13 06:00

    contains and icontains mentioned by falsetru make queries like SELECT ... WHERE headline LIKE '%pattern%

    Along with them, you might need these ones with similar behavior: startswith, istartswith, endswith, iendswith

    making

    SELECT ... WHERE headline LIKE 'pattern%

    or

    SELECT ... WHERE headline LIKE '%pattern

    0 讨论(0)
  • 2020-12-13 06:06

    In order to preserve the order of the words as in the sql LIKE '%pattern%' statement I use iregex, for example:

    qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))
    

    string methods are immutable so your pattern variable will not change and with .* you'll be looking for 0 or more occurrences of any character but break lines.

    By using the following to iterate over the pattern words:

    qs = table.objects
    for word in pattern.split(' '):
        qs = qs.filter(string__icontains=word)
    

    the order of the words in your pattern will not be preserved, for some people that could work but in the case of trying to mimic the sql like statement I'll use the first option.

    0 讨论(0)
提交回复
热议问题