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;

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM