zoukankan      html  css  js  c++  java
  • django-查询语句(一)

    1.model

    假设我们的model如下:

    某个JobType下有很多Job。

    class JobType(models.Model):
        name = models.CharField(max_length=10)
        description = models.CharField(max_length=100, null=True, blank=True)
    
        def __str__(self):
            return self.name
    class Job(models.Model):
        name = models.CharField(max_length=50)
        type = models.ForeignKey(JobType, related_name='jobs')
        city = models.CharField(max_length=30)
        experience = models.CharField(max_length=15)
        education = models.CharField(max_length=10)
        salary = models.CharField(max_length=15)
    public_time = models.DateTimeField()
    def __str__(self): return self.name

    2.查询

    2.1 查询所有JobType

    In [1]: JobType.objects.all()

    Out[1]: [<JobType: Java>, <JobType: Python>, <JobType: PHP>]

     

    对上述的queryset按名字排序(逆序则在字段前加减号‘-’,如order_by('-name') )

    In [2]: JobType.objects.all().order_by('name')

    Out[2]: [<JobType: Java>, <JobType: PHP>, <JobType: Python>]

     

     

    2.2 查询name为‘Python’的JobType( 注意用get()方法得到的是单个对象而不是queryset,若有多个对象满足条件应该使用filter()方法。 )

    In [3]: JobType.objects.get(name='Python')

    Out[3]: <JobType: Python>

     

    注意:1)若get()返回多个对象,会引发异常 MultipleObjectsReturned

         2)若没有对象符合查询条件,会引发异常 DoseNotExist,如:

    JobType.objects.get(id=100)  # raises JobType.DoesNotExist

       

    2.3 查询所有JobType的name为Python的Job

    In [4]: type = JobType.objects.get(name='Python')

    In [5]: Job.objects.filter(type=type)

    Out[5]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']

     

     

    由于我们在Job model中定义type外键时,定义了related_name=‘jobs’,故还能用下面的方法查询

    In [6]: type = JobType.objects.get(name='Python') 

    In [7]: type.jobs.all()

    Out[7]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']

     

     

    当然,我们也可以用一条语句完成这个查询。就是下面的跨表查询,即外键 + 两条下划线 + 另一个表的字段:fk__field-in-foreign-model

    In [8]: Job.objects.filter(type__name='Python')

    Out[8]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']

     

     

    2.4 查询JobType的name为‘Python’之外的所有Job

    In [9]: Job.objects.all().exclude(type__name='Python')

    Out[9]: [<Job: PHP/高级PHP工程师>, <Job: PHP开发工程师>, <Job: PHP>, <Job: PHP开发>, <Job: PHP>, <Job: PHP工程师>, <Job: PHP工程师>, <Job: PHP>, <Job: PHP研发工程师>, <Job: PHP开发工程师>, <Job: PHP>, <Job: PHP>, <Job: PHP开发工程师>, <Job: 高级PHP开发工程师>, <Job: PHP高级工程师>]

     

     

     

    3.django内置的查询字段

    语法为字段 + 两条下划线 + 内置查询字段:field__bulit-in

     

    3.1 gt(gte): 大于(大于等于)

    查询id > 2的JobType:

    In [9]: JobType.objects.filter(id__gt=2)

    Out[9]: [<JobType: PHP>]

     

    相当于sql语句:

    SELECT ... WHERE id > 2;

     

    类似的还有 lt(lte): 小于(小于等于)

     

     

     

    3.2 in

    查询id为1,3的JobType:

    In [10]: JobType.objects.filter(id__in=[1,3])

    Out[10]: [<JobType: Java>, <JobType: PHP>]

     

    相当于sql语句:

    SELECT ... WHERE id IN (1, 3);

    3.3 range 常用来筛选出属于某个连续区间的对象

    查询id在1~3范围内的所有JobType:

    In [11]: JobType.objects.filter(id__range=(1,3))

    Out[11]: [<JobType: Java>, <JobType: Python>, <JobType: PHP>]

     

    相当于sql语句:

    SELECT ... WHERE id BETWEEN 1 and 3;

      

    3.4 contains 包含‘xxx’(大小写敏感),常用于找出包含某些关键字的对象

    查询type名字包含“python”的Job:

    In [12]: Job.objects.filter(type__name__contains='python')

    Out[12]: []

     

    相当于sql语句:

    SELECT ... WHERE name LIKE '%python%';

    类似的有icontains (大小写不敏感)注意contains是大小写敏感的,icontains是大小写不敏感的。对比如下:

    In [13]: Job.objects.filter(type__name__icontains='python')

    Out[13]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']

     

     

     

    3.5 startswith 以‘xxx’开头(大小写敏感)

    In [14]: Job.objects.filter(name__startswith='高级')

    Out[14]: [<Job: 高级python研发工程师>, <Job: 高级Python工程师>, <Job: 高级python开发>, <Job: 高级python工程师>, <Job: 高级python开发>, <Job: 高级python工程师>, <Job: 高级Python工程师>, <Job: 高级Python工程师>, <Job: 高级python开发工程师>, <Job: 高级Python工程师>, <Job: 高级工程师-Python>, <Job: 高级python工程师>, <Job: 高级Python开发工程师>, <Job: 高级Python开发工程师>, <Job: 高级Python开发工程师>, <Job: 高级python工程师>, <Job: 高级Python工程师>, <Job: 高级python开发工程师>, <Job: 高级Python开发工程师>, <Job: 高级python开发工程师>, '...(remaining elements truncated)...']

     

    相当于sql语句:

    SELECT ... WHERE name LIKE '高级%';

     

    类似的有istartswith (大小写不敏感)

     

     

     

    3.6 endswith 以‘xxx’结尾(大小写敏感)

    类似的有iendswith (大小写不敏感)

     

     

     

    3.7 regex 正则(大小写敏感)

    找出city以‘北京’或者‘上海’开头的Job:

     

    In [15]: Job.objects.filter(city__regex=r'^(上海|北京)')

    Out[15]: [<Job: Python开发工程师>, <Job: Python>, <Job: Python开发>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, <Job: python实习生>, <Job: python工程师>, <Job: python/django开发工程师>, <Job: python工程师>, <Job: 资深Python开发>, <Job: Python>, <Job: Python工程师/实习生--无人车方向>, <Job: Python>, <Job: python高级工程师>, <Job: Python开发>, <Job: python工程师>, <Job: python开发(校招)>, '...(remaining elements truncated)...']

     

    类似的有iregex (大小写不敏感)

     

     

     

    3.8 和DateTime字段相关的内置查询字段

    date 使用date类型的值

    year 使用整数来表示年份

    month 使用整数1~12来表示12个月份

    day 使用整数来表示日

    week_day 使用整数1~7来表示星期几(其中1为星期日)

    hour 使用整数0~23来表示24小时

    minute 使用整数0~59来表示分钟

    second 使用整数0~59来表示秒钟

     

    比如查询在2017年2月14日之后发布的Job:

    Job.objects.filter(public_time__date__gt=datetime.date(2017,2,14))

    查询2017年1月份发布的Job:

    Job.objects.filter(public_time__year=2017, public_time__month=1)

    3.9  isnull  可设置为True或者False,用来筛选某字段 为NULL / 不为NULL 的对象

    In [16]: JobType.objects.filter(description__isnull=True)

    Out[16]: [<JobType: Java>, <JobType: PHP>]

     

    相当于sql语句:

    SELECT ... WHERE description IS NULL;

     

     

     

     

  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/rinka/p/django_make_queries_anout_built-in_lookups.html
Copyright © 2011-2022 走看看