• Django Field lookups (字段查找)


    字段查找是指定SQL WHERE子句的核心内容的方式。

    它们被指定为QuerySet方法filter()、exclude()和get()的关键字参数。

    1、exact:精确查找。如果为比较提供的值为None,则会将其解释为SQL NULL

      在MySQL中,数据库表的“排序”设置决定了精确的比较是否区分大小写。这是一个数据库设置,而不是Django设置。

      可以将MySQL表配置为使用区分大小写的比较。

    Entry.objects.get(id__exact=14)
    Entry.objects.get(id__exact=None)
    SELECT ... WHERE id = 14;
    SELECT ... WHERE id IS NULL;

    2、iexact:不区分大小写的精确查找

    Blog.objects.get(name__iexact='beatles blog')
    Blog.objects.get(name__iexact=None)
    SELECT ... WHERE name ILIKE 'beatles blog';
    SELECT ... WHERE name IS NULL;

    3、contains:包含,模糊查询

    Entry.objects.get(headline__contains='Lennon')
    SELECT ... WHERE headline LIKE '%Lennon%';

    4、icontains:包含,不区分大小写

    Entry.objects.get(headline__icontains='Lennon')
    SELECT ... WHERE headline ILIKE '%Lennon%';

    5、in:范围查询

    Entry.objects.filter(id__in=[1, 3, 4])
    Entry.objects.filter(headline__in='abc')
    SELECT ... WHERE id IN (
    1, 3, 4); SELECT ... WHERE headline IN ('a', 'b', 'c');

      也可以判定结果集,子查询

    inner_qs = Blog.objects.filter(name__contains='Cheddar')
    entries = Entry.objects.filter(blog__in=inner_qs)
    
    SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')

      如果将由values()或values_list()生成的QuerySet作为值传递给__in查找,则需要确保只提取结果中的一个字段。

    inner_qs = Blog.objects.filter(name__contains='Ch').values('name')
    entries = Entry.objects.filter(blog__name__in=inner_qs)

    6、gt:大于;

       gte:大于等于

       lt:小于

          lte:小于等于

    Entry.objects.filter(id__gt=4)
    
    SELECT ... WHERE id > 4;

    7、startswith:区分大小写的开始。

       istartswith:不区分大小写

    Entry.objects.filter(headline__startswith='Lennon')
    SELECT ... WHERE headline LIKE
    'Lennon%';
    Entry.objects.filter(headline__istartswith='Lennon')
    SELECT ... WHERE headline ILIKE 'Lennon%';

    8、endswith:区分大小写结尾

       iendswith:不区分大小写

    Entry.objects.filter(headline__endswith='Lennon')
    SELECT ... WHERE headline LIKE '%Lennon';
    
    Entry.objects.filter(headline__iendswith='Lennon')
    SELECT ... WHERE headline ILIKE '%Lennon'

    9、range:范围

      在SQL中,您可以在任何地方使用range——日期、数字甚至字符。

    import datetime
    start_date = datetime.date(2005, 1, 1)
    end_date = datetime.date(2005, 3, 31)
    Entry.objects.filter(pub_date__range=(start_date, end_date))
    
    SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';

    10、date,year,month,day,weak

    Entry.objects.filter(pub_date__year=2005)
    Entry.objects.filter(pub_date__year__gte=2005)
    
    SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31';
    SELECT ... WHERE pub_date >= '2005-01-01';
    Entry.objects.filter(pub_date__month=12)
    Entry.objects.filter(pub_date__month__gte=6)

    SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12';
    SELECT ... WHERE EXTRACT('month' FROM pub_date) >= '6';

    11、weekday:取一个整数值,表示从1(星期日)到7(星期六)的星期几。

    Entry.objects.filter(pub_date__week_day=2)
    Entry.objects.filter(pub_date__week_day__gte=2)

    12、quarter:季度。对于日期和日期时间字段,匹配一个“季度”。允许链接额外的字段查找。取1到4之间的整数值,表示该年度的季度。

    Entry.objects.filter(pub_date__quarter=2)

    13、time:时间

    Entry.objects.filter(pub_date__time=datetime.time(14, 30))
    Entry.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))

    14、hour:小时。对于日期时间和时间字段,一个精确的小时匹配。允许链接额外的字段查找。取0到23之间的整数。

      minute:分钟。0-59

      second:秒。0-59

    Event.objects.filter(timestamp__hour=23)
    Event.objects.filter(time__hour=5)
    Event.objects.filter(timestamp__hour__gte=12)
    
    SELECT ... WHERE EXTRACT('hour' FROM timestamp) = '23';
    SELECT ... WHERE EXTRACT('hour' FROM time) = '5';
    SELECT ... WHERE EXTRACT('hour' FROM timestamp) >= '12';

    15、isnull:是否为空,对应SQL的IS NULL 和IS NOT NULL

    Entry.objects.filter(pub_date__isnull=True)
    
    SELECT ... WHERE pub_date IS NULL;

    16、regex:正则匹配

      iregex:不区分大小写的正则表达式

    Entry.objects.get(title__iregex=r'^(an?|the) +')
    
    SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL
    SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle
    SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL
    SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite
  • 相关阅读:
    POJ 3037 Skiing(Dijkstra)
    HDU 1875 畅通工程再续(kruskal)
    HDU 1233 还是畅通工程(Kruskal)
    Java实现 LeetCode 754 到达终点数字(暴力+反向)
    Java实现 LeetCode 754 到达终点数字(暴力+反向)
    Java实现 LeetCode 754 到达终点数字(暴力+反向)
    Java实现 LeetCode 753 破解保险箱(递归)
    Java实现 LeetCode 753 破解保险箱(递归)
    Java实现 LeetCode 753 破解保险箱(递归)
    Java实现 LeetCode 752 打开转盘锁(暴力)
  • 原文地址:https://www.cnblogs.com/SunQi-Tony/p/9925455.html
Copyright © 2020-2023  润新知