django-ORM的查询条件

余生颓废 提交于 2021-02-11 13:05:21

前提是创建好了ORM的模型(参照https://www.cnblogs.com/ifdashui/p/11901084.html)

现在数据库中存在下列的数据(以下的查询条件根据这些数据做处理)

 

在models.py中

# -*- coding: UTF-8 -*-
from django.db import models

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

    class Meta:
        db_table = 'article'  #更改这个表的名字,映射到数据中的话名称不是Article_article了,是你自定义设置的article

使用下面这两条命令在数据库中映射:(注意进入项目路径以及有虚拟环境的进入虚拟环境)

python manage.py makemigrations

python manage.py migrate

接下来就在views.py中操作即可

 在model.py中,创建一个ORM模型

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    category = models.ForeignKey('Category',on_delete=models.CASCADE,null=True)  #关联上这个表

    class Meta:
        db_table = 'article'  #更改这个表的名字,映射到数据中的话名称不是Article_article了,是你自定义设置的article

查询条件

然后再views.py中

1.exact 相当于数据库底层的等号 =

from .models import Article

def index(request):
    #1.exact  相当于数据库底层的等号  =
    # article = Article.objects.filter(title__exact="Hello Word") #相当于数据库底层的 select ··· from ··· where title='Hello World'

2.iexact 相当于数据库底层的 like

#2.iexact 相当于数据库底层的 like
    # article = Article.objects.filter(title__iexact="Hello Word") #相当于数据库底层 article` WHERE `article`.`title` LIKE Hello Word

3.contains 使用大小写敏感判断,某个字符是否存在指定字符串中,也就是你查找a,数据库中是A,那么就查询不到

#3.contains 使用大小写敏感判断,某个字符是否存在指定字符串中,也就是你查找a,数据库中是A,那么就查询不到
    article = Article.objects.filter(title__contains='hello')   #即相当于数据库底层的select ··· from ··· where title like '%Hello World%'

4.icontains  使用大小写是不敏感的 也就是你查找a,数据库中是A,那么一样查询得到

#4.icontains  使用大小写是不敏感的 也就是你查找a,数据库中是A,那么一样查询得到
    # article = Article.objects.filter(title__icontains='hello') #select ··· from ··· where title like '%Hello World%'   百分号也就是你这个字符串中只要包含相关的数据就都能查询出来

5.in   查询条件是否在给定的范围内,用小括号和中括号都可以

#5.in   查询条件是否在给定的范围内,用小括号和中括号都可以
    # articles = Article.objects.filter(id_in=[1,2])  #提取出id=1,id=2中的数据, 相当于数据库底层的select ··· from ··· where id in [1,2]
                                                    #如何不存在的话就不会提取出来

如果是多表下的查询的话(需要在models.py中,在创建一个表,然后外键关联上这个表)

models.py下

from
django.db import models 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() category = models.ForeignKey('Category',on_delete=models.CASCADE,null=True) #关联上这个表 class Meta: db_table = 'article' #更改这个表的名字,映射到数据中的话名称不是Article_article了,是你自定义设置的article

使用下面这两条命令在数据库中映射:(注意进入项目路径以及有虚拟环境的进入虚拟环境)

python manage.py makemigrations

python manage.py migrate

在views.py下    

#多表查询下的操作 categorys = Category.objects.filter(article__id__in=[1,2]) #在article表下找到id为1和2,然后根据这个1和2分类出Category表下的数据,并且可以使用for循环打印出来 for category in categorys: print(category)
#这里为什么是 article ,因为这个张表(Article)使用META反向引用了(也就是给这张表改了个名字),
#直接使用的话模型的名字小写化就行了,不用写成article_set的形式,如果想更改这个默认的方法,在定义外键的时候
#传递related_query_name='自定义名字'

 6.gt  找出大于什么什么的数据

#6.gt 找出大于什么什么的数据
    articles = Article.objects.filter(id__gt=2) #查询id大于2的所有数据
    print(articles)

7.gte 也就是等于的意思

#7.gte 找出大于等于什么的数据
    articles = Article.objects.filter(id__gte=2) #查询id大于等于2的所有数据
    print(articles)

8.lt 找出小于什么的数据

#8.lt 找出小于什么的数据
    articles = Article.objects.filter(id__lt=2) #查询id小于2的所有数据
    print(articles)

9.lte 找出小于等什么的数据

#8.lte 找出小于等什么的数据
    articles = Article.objects.filter(id__lte=2) #查询id小于等于2的所有数据
    print(articles)

10.startswith:以指定某个字符串开始,大小写敏感

#10.startswith:以指定某个字符串开始,大小写敏感
    articles = Article.objects.filter(title__startswith='hello') #查询该表下hello为开头的数据,不是hello开头,或者存在大小写的都查询不到
    print(articles)

11.istartswith:以指定某个字符串开始,大小写不敏感

#11.istartswith:以指定某个字符串开始,大小写不敏感
    articles = Article.objects.filter(title__istartswith='hello') #查询该表下hello为开头的数据,不是hello开头的查询不到,不在乎大小写
    print(articles)

12.endswith:查询某个字符串结束的数据,大小写敏感

#12.endswith:查询某个字符串结束的数据,大小写敏感
    articles = Article.objects.filter(title__endswith='hello') #查询该表下hello为结尾的数据,如果存在大写,那就查找不出来
    print(articles)

13.iendswith:查询某个字符串结束的数据,大小写不敏感

#13.iendswith:查询某个字符串结束的数据,大小写不敏感
    articles = Article.objects.filter(title__iendswith='hello') #查询该表下hello为结尾的数据,忽略大小写
    print(articles)

 14.range:获取某个范围内的数据,即相当于between ··· and ···,用小括号和中括号都可以

这里以获取某个时间段为例

先在models.py中增加一个时间字段

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    category = models.ForeignKey('Category',on_delete=models.CASCADE,null=True)  #关联上这个表
    create_time = models.DateTimeField(auto_now_add=True,null=True) #auto_now_add=True 自动获得当前的时间并且设置进去

使用下面这两条命令在数据库中映射:(注意进入项目路径以及有虚拟环境的进入虚拟环境)

python manage.py makemigrations

python manage.py migrate

接着在views.py中

#注意导入需要的库
from datetime import datetime
from django.utils.timezone import make_aware
#14.range:获取某个范围内的数据,即相当于between ··· and ···,用小括号和中括号都可以
    #这里以获取某个时间段为例
    start_time = make_aware(datetime(year=2019,month=4,day=4,hour=17,minute=0,second=0))
    end_time = make_aware(datetime(year=2019,month=4,day=4,hour=18,minute=0,second=0))
    articles = Article.objects.filter(create_time__range=(start_time,end_time)) 
    print(articles)

15. date 时间的过滤的查找条件,根据年月日来查询(time、year、week_day等)

articles = Article.objects.filter(create_time__date=datetime(year=2018,month=4,day=4))  #找到符合条件2018-4-4的所有数据
    print(articles)

    return HttpResponse('success')16. isnull 判断某个数据是否为空进行查找

 16. isnull 判断某个数据是否为空进行查找

#16. isnull 判断某个数据是否为空进行查找
    articles = Article.objects.filter(create_time__isnull=True) #获取该create_time字段下为空的数据
    print(articles)

17. regex 使用正则查询数据,大小写敏感

#17. regex 使用正则查询数据,大小写敏感
    articles = Article.objects.filter(title__regex=r'^hell') #获取该title字段下为开头为hell的数据,区分大小写
    print(articles)

18. iregex 使用正则查询数据,不区分大小写

#18. iregex 使用正则查询数据,不区分大小写
    articles = Article.objects.filter(title__iregex=r'^hell') #获取该title字段下开头为为hell的数据,不区分大小写
    print(articles)

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!