18.查詢操做

 

查詢操做

1.exact:在底層會被翻譯=
2.iexact:在底層會被翻譯成like
like和=:大部分狀況下都是等價的,只有少數狀況下是不等價的.
exact和iexact:他們的區別其實就是like和=的區別.由於exact會被翻譯成=,而iexact會被翻譯成like
由於field__exact==xxx其實等價於field=xxx,所以咱們直接使用field=xxx解能夠了,而且由於大部分狀況exactiexact又是等價的,所以咱們之後直接使用field=xxx就能夠了javascript

3.QuerySet.query: query能夠用來查看這個OMR 查詢語句最終被翻譯成的SQL語句.可是query只能被用來QuerySet對象上,不能用在普通的ORM模型上.所以若是你的查詢語句是經過get來獲取數據的,那麼就不能使用query,由於get返回的是知足條件的ORM模型,而不是QuerySet類型,若是你是經過filter等其餘返回QuerySet的方法查詢的,那麼就可使用queryhtml

4.contains: 使用大小寫敏感的判斷,某個字符串是否在指定的字段中.這個查詢語句會使用大小敏感,所以在被翻譯成SQL語句的時候,會使用like binary,而like binary就是使用大小寫敏感的.
5.icontains : 忽略大小寫,判斷某個字符串是否在指定的字段中.這個查詢語句在被翻譯成SQL的時候,使用的是like,而likeMySQL層面就是不區分大小寫的.java

注: `contains`和`icontains`: 在被翻譯成`SQL`的時候使用的是`%hello%`,就是隻要整個字符串中出現了`hello`就可以被找到.而`iexact`沒有`%`,那麼意味着只有徹底相等的時候纔會被匹配到.

6.in: 能夠直接指定某個字段的值是否在某個集合中.示例代碼以下:python

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


也能夠經過其餘的表的字段來判斷是否在某個集合中.示例代碼以下:ios

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


若是要判斷相關聯的表的字段,那麼也是經過__來鏈接.而且在作反向引用的時候,不須要寫models_set,直接使用模型的名字的小寫化就能夠了.好比經過分類去查找相應的文章,那麼就經過article__id__in就能夠了,而不是寫成article_set__id__in的形式.若是在定義ForeignKey的時候傳遞了related_query_name=articles來制定雙下劃線反向引用的名字,那麼用雙下劃線反向查找的時候就要使用articles__id__in了.示例代碼以下:web

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'


由於在categoryForeignKey中指定了related_query_name,所以你不能再使用article來進行反向查詢了.這時候就須要經過articles來進行反向查詢.
而且,若是在作反向查詢的時候,若是查詢的字段就是模型的主鍵,那麼能夠省略掉這個字段,直接寫成article__in就能夠了,
注:ForeignKey的參數:related_name: 是模型對象反向查詢的時候用,而related_query_name是雙下劃線方法反向查詢的時候用的.django

`in`不單單能夠制定列表/元組,還能夠爲`QuerySet`.好比要查詢"文章標題中有hello的全部分類",那麼能夠經過如下代碼來實現:
```python
articles = Article.objects.filter(title__icontains='hello')
categories = Category.objects.filter(articles__in=articles)
for cateogry in categories:
    print(cateogry)

```

7.gt/gte/lt/lte:表明的是大於/大於等於/小於/小於等於的條件.
gt:greater than;lt:lower than;gte:greater than equal;lte:lower than equal.示例代碼以下:api

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

8.startswithistartswithendswithiendswith:表示以某個值開始,不區分大小寫的以某個值開始、以某個值結束、不區分大小寫的以某個值結束。示例代碼以下:markdown

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

9.關於時間的查詢條件:ide

  • range:能夠指定一個時間段。而且時間應該標記爲aware時間,否則django會報警告。示例代碼以下:

    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中添加好那些時區文件。如何添加呢?參考教案。示例代碼以下:

    articles = Article.objects.filter(create_time__date=datetime(year=2018,month=4,day=4))
  • year/month/day:表示根據年/月/日進行查找。示例代碼以下:
    articles = Article.objects.filter(create_time__year__gte=2018)
  • week_day:根據星期來進行查找。1表示星期天,7表示星期六,2-6表明的是星期一到星期五。好比要查找星期三的全部文章,那麼能夠經過如下代碼來實現:
    articles = Article.objects.filter(create_time__week_day=4)
  • time:根據分時秒來進行查找。若是要具體到秒,通常比較難匹配到,可使用區間的方式來進行查找。區間使用range條件。好比想要獲取17時/10分/27-28秒之間的文章,那麼能夠經過如下代碼來實現:
    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))
相關文章
相關標籤/搜索