django 筛选数据

  1. exact:在底层会被翻译成=
  1. iexact:在底层会被翻译成LIKE

    • LIKE和=:大部分情况下都是等价的,只有少数情况下是不等价的。

    • exict和iexact:他们的区别其实就是LIKE和=的区别,因为exact会被翻译成=,而iexact会被翻译成LIKE。

    • 因为field__exact=xxx其实等价于filed=xxx,因此我们直接使用filed=xxx就可以了,并且因为大部分情况exactiexact又是等价的,因此我们以后直接使用field=xxx就可以了。

  1. QuerySet.query:query可以用来查看这个ORM查询语句最终被翻译成的SQL语句。但是query只能被用在QuerySet对象上,不能用在普通的ORM模型上。因此如果你的查询语句是通过get来获取数据的,那么就不能使用query,因为get返回的是满足条件的ORM模型,而不是QuerySet。如果你是通过filter等其他返回QuerySet的方法查询的,那么就可以使用query
  1. contains:使用大小写敏感的判断,某个字符串是否在指定的字段中。这个判断条件会使用大小敏感,因此在被翻译成SQL语句的时候,会使用like binary,而like binary就是使用大小写敏感的。
  1. icontains:使用大小写不敏感的判断,某个字符串是否被包含在指定的字段中。这个查询语句在被翻译成SQL的时候,使用的是like,而likeMySQL层面就是不区分大小写的。

  2. contains和icontains:在被翻译成SQL的时候使用的是%hello%,就是只要整个字符串中出现了hello都能过够被找到,而iexact没有百分号,那么意味着只有完全相等的时候才会被匹配到。

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

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

    也可以通过其他的表的字段来判断是否在某个集合中。示例代码如下:

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

    如果要判断相关联的表的字段,那么也是通过__来连接。并且在做关联查询的时候,不需要写models_set,直接使用模型的名字的小写化就可以了。比如通过分类去查找相应的文章,那么通过article__id__in就可以了,而不是写成article_set__id__in的形式。当然如果你不想使用默认的形式,可以在外键定义的时候传递related_query_name来指定反向查询的名字。示例代码如下:

    
    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'
    
    

    因为在cateogryForeignKey中指定了related_query_namearticles,因此你不能再使用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)

```
  1. gt、gte、lt、lte:代表的是大于、大于等于、小于、小于等于的条件。示例代码如下:

    
    articles = Article.objects.filter(id__lte=3)
    
    
  1. startswith、istartswith、endswith、iendswith:表示以某个值开始,不区分大小写的以某个值开始、以某个值结束、不区分大小写的以某个值结束。示例代码如下:

    
    articles = Article.objects.filter(title__endswith="hello")
    
    
  1. 关于时间的查询条件:

    • 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`中添加好那些时区文件。如何添加呢?参考教案。示例代码如下:

    ```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))

    ```
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容