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))
相关文章
相关标签/搜索