63.Python中contains和icontains


1. contains: 進行大小寫敏感的判斷,某個字符串是否包含在指定的字段中,這個判斷條件使用大小寫敏感進行判斷,因此在被翻譯成“SQL”語句的時候,會使用“like binary”, 而“like binary”就是使用大小寫敏感進行判斷。

2. icontains: 進行大小寫不敏感的判斷,某個字符串是否包含在指定的字段中,這個判斷條件使用大小寫不敏感進行判斷,因此在被翻譯成“SQL”語句的時候,會使用“like”, 而“like”就是使用大小寫不敏感進行判斷。其中icontains前面的i指的就是ignore(忽略)。

具體實例,示例代碼如下:
models.py文件中模型的定義,示例代碼如下:
from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

# 重寫類的__str__(self)方法
    def __str__(self):
        return "<(Article: id: %s,title: %s, content: %s)>" % (self.id, self.title, self.content)

# 重新定義表的一些屬性,注意:此處的類的名字一定要為Meta
    class Meta:
        db_table = 'article'
1. contains: views.py文件中視圖函數的示例代碼如下:
from django.http import HttpResponse
from .models import Article


def index(request):
# 注意:此處是使用filter(),只有使用filter()之后才能夠在article(QuerySet)上調用query屬性,查看django底層轉化的sql語句。
	article = Article.objects.filter(title__contains='hello')
	print(article)
	print(article.query)
	return HttpResponse('success !')
在mysql數據庫中article表的數據信息如下:

在這里插入圖片描述

因為contains進行的是大小寫敏感的查找,所以不能找到匹配的數據,則會返回QuerySet為空。並且我們可以看到執行我們的查找條件的時候,django底層翻譯成的sql語句中的:WHERE article.title LIKE BINARY %hello%,這里的LIKE BINARY 就可以保證進行的查找為大小寫敏感的查找,並且hello字符串的兩邊會有%(代表hello字符串前面可以含有別的字符,后面也可以含有別的字符),這就可以驗證我們上面的解釋。

在這里插入圖片描述

2.icontains: views.py文件中視圖函數示例代碼如下:
from django.http import HttpResponse
from .models import Article


def index(request):
    # icontains進行查找title中包含“hello”的字符串
    article = Article.objects.filter(title__icontains='hello')
    print(article)
    print(article.query)
    return HttpResponse("success")
因為使用icontains采用的是大小寫不敏感的的查找方式,所以會返回兩條滿足條件的QuerySet,並且重以下打印的結果中可以看出,我們的查詢條件被翻譯成了:WHERE article.title LIKE %hello%,這里的LIKE進行的查找就是大小寫不敏感的查找。

在這里插入圖片描述

總結:iexact和exact進行的是准確性的查找,只有完全匹配我們的值“hello”的時候,才能夠被找到。而icontains和contains中的查詢條件,在進行查找的時候,會被翻譯成sql語句中包含“%hello%”,在這里%意味着,前面可以含有n個字符,后面也可以含有n個字符。只要數據中包含hello字符串,就滿足條件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM