django數據庫過濾的總結


 

1. exact:在底層會被翻譯成`=`。

 

2. iexact:在底層會被翻譯成`LIKE`。

    * LIKE和=:大部分情況下都是等價的,只有少數情況下是不等價的。

    * exict和iexact:他們的區別其實就是LIKE和=的區別,因為exact會被翻譯成=,而iexact會被翻譯成LIKE。

    * 因為`field__exact=xxx`其實等價於`filed=xxx`,因此我們直接使用`filed=xxx`就可以了,並且因為大部分情況`exact`和`iexact`又是等價的,因此我們以后直接使用`field=xxx`就可以了。

 

3. QuerySet.query:`query`可以用來查看這個`ORM`查詢語句最終被翻譯成的`SQL`語句。但是`query`只能被用在`QuerySet`對象上,不能用在普通的`ORM模型`上。因此如果你的查詢語句是通過`get`來獲取數據的,那么就不能使用`query`,因為`get`返回的是滿足條件的`ORM`模型,而不是`QuerySet`。如果你是通過`filter`等其他返回`QuerySet`的方法查詢的,那么就可以使用`query`。

 

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

 

5. icontains:使用大小寫不敏感的判斷,某個字符串是否被包含在指定的字段中。這個查詢語句在被翻譯成`SQL`的時候,使用的是`like`,而`like`在`MySQL`層面就是不區分大小寫的。

6. contains和icontains:在被翻譯成`SQL`的時候使用的是`%hello%`,就是只要整個字符串中出現了`hello`都能過夠被找到,而`iexact`沒有百分號,那么意味着只有完全相等的時候才會被匹配到。

 

7. in:可以直接指定某個字段的是否在某個集合中。示例代碼如下:

    ```python

    articles = Article.objects.filter(id__in=[1,2,3])

    ```

    也可以通過其他的表的字段來判斷是否在某個集合中。示例代碼如下:

    ```python

    categories = Category.objects.filter(article__id__in=[1,2,3])

    ```

    如果要判斷相關聯的表的字段,那么也是通過`__`來連接。並且在做關聯查詢的時候,不需要寫`models_set`,直接使用`模型的名字的小寫化`就可以了。比如通過分類去查找相應的文章,那么通過`article__id__in`就可以了,而不是寫成`article_set__id__in`的形式。當然如果你不想使用默認的形式,可以在外鍵定義的時候傳遞`related_query_name`來指定反向查詢的名字。示例代碼如下:

    ```python

    class Category(models.Model):

        name = models.CharField(max_length=100)

 

        class Meta:

            db_table = 'category'

 

 

    class Article(models.Model):

        title = models.CharField(max_length=200)

        content = models.TextField()

        cateogry = models.ForeignKey("Category",on_delete=models.CASCADE,null=True,related_query_name='articles')

 

        class Meta:

            db_table = 'article'

    ```

    因為在`cateogry`的`ForeignKey`中指定了`related_query_name`為`articles`,因此你不能再使用`article`來進行反向查詢了。這時候就需要通過`articles__id__in`來進行反向查詢。

 

    反向查詢是將模型名字小寫化。比如`article__in`。可以通過`related_query_name`來指定自己的方式,而不使用默認的方式。

    反向引用是將模型名字小寫化,然后再加上`_set`,比如`article_set`,可以通過`related_name`來指定自己的方式,而不是用默認的方式。

 

    並且,如果在做反向查詢的時候,如果查詢的字段就是模型的主鍵,那么可以省略掉這個字段,直接寫成`article__in`就可以了,不需要這個`id`了。

 

    `in`不僅僅可以指定列表/元組,還可以為`QuerySet`。比如要查詢“文章標題中包含有hello的所有分類”,那么可以通過以下代碼來實現:

    ```python

    articles = Article.objects.filter(title__icontains='hello')

    categories = Category.objects.filter(articles__in=articles)

    for cateogry in categories:

        print(cateogry)

    ```

 

8. gt、gte、lt、lte:代表的是大於、大於等於、小於、小於等於的條件。示例代碼如下:

    ```python

    articles = Article.objects.filter(id__lte=3)

    ```

 

9. startswith、istartswith、endswith、iendswith:表示以某個值開始,不區分大小寫的以某個值開始、以某個值結束、不區分大小寫的以某個值結束。示例代碼如下:

    ```python

    articles = Article.objects.filter(title__endswith="hello")

    ```

 

10. 關於時間的查詢條件:

    * range:可以指定一個時間段。並且時間應該標記為`aware`時間,不然django會報警告。示例代碼如下:

        ```python

        start_time = make_aware(datetime(year=2018,month=4,day=4,hour=17,minute=0,second=0))

        end_time = make_aware(datetime(year=2018,month=4,day=4,hour=18,minute=0,second=0))

        articles = Article.objects.filter(create_time__range=(start_time,end_time))

        print(articles.query)

        print(articles)

        ```

 

    * date:用年月日來進行過濾。如果想要使用這個過濾條件,那么前提必須要在`MySQL`中添加好那些時區文件。如何添加呢?參考教案。示例代碼如下:

        ```python

        articles = Article.objects.filter(create_time__date=datetime(year=2018,month=4,day=4))

        ```

    * year/month/day:表示根據年/月/日進行查找。示例代碼如下:

        ```python

        articles = Article.objects.filter(create_time__year__gte=2018)

        ```

    * week_day:根據星期來進行查找。1表示星期天,7表示星期六,2-6代表的是星期一到星期五。比如要查找星期三的所有文章,那么可以通過以下代碼來實現:

        ```python

        articles = Article.objects.filter(create_time__week_day=4)

        ```

    * time:根據分時秒來進行查找。如果要具體到秒,一般比較難匹配到,可以使用區間的方式來進行查找。區間使用`range`條件。比如想要獲取17時/10分/27-28秒之間的文章,那么可以通過以下代碼來實現:

        ```python

        start_time = time(hour=17,minute=10,second=27)

        end_time = time(hour=17,minute=10,second=28)

        articles = Article.objects.filter(create_time__time__range=(start_time,end_time))

        ```

 


免責聲明!

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



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