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;