最新紀(jì)錄和空值判斷等功能
1、count
返回查詢的 QuerySet 的總數(shù)。
比如想查詢 Blog 下 name = 'hunter' 的總數(shù):
Blog.objects.filter(name="hunter").count()
返回的結(jié)果直接是一個整數(shù),類似的 SQL 代碼如下:
select count(*) from blog_blog where name = 'hunter';
2、in_bluk
返回一個 dict,key 為我們指定的字段名的值,value 為這個字段名所在 object 數(shù)據(jù)。
比如我們需要查詢 Blog 這個 model 下 name 為 "hunter", "jack" 的數(shù)據(jù),可以如下實現(xiàn):
Blog.objects.in_bulk(["hunter", "jack"], field_name="name")
返回的數(shù)據(jù)如下:
{'hunter': <Blog: Blog object (1)>, 'jack': <Blog: Blog object (2)>}
但是需要注意,field_name 這個字段必須有唯一鍵的約束,即:
class Blog(models.Model):
? ?name = models.CharField(max_length=100, unique=True)
? ?tagline = models.TextField()
不指定 field_name
如果不指定 field_name 的值的話,那么則會默認第一個參數(shù)列表的 value 值為 id:
Blog.objects.in_bulk([1, 2])
{1: <Blog: Blog object (1)>, 2: <Blog: Blog object (2)>}
不傳參數(shù)
如果函數(shù)里不傳參數(shù),則默認以 field_name="id" 返回所有數(shù)據(jù):
Blog.objects.in_bulk()
參數(shù)為空
如果函數(shù)里的參數(shù)為空,則返回空:
Blog.objects.in_bulk([])
3、latest、earliest
latest() 和 earliest() 一樣,都是按照指定字段排序后返回最新的,或者最早的一條數(shù)據(jù),返回的是 model 的一個實例。
前面介紹在 model 的 Meta 里如果給 get_latest_by 指定了字段,那么 latest() 就可以不加參數(shù),默認按照 get_latest_by 的參數(shù)進行排序獲取數(shù)據(jù)。
否則必須在 latest() 里指定字段。
用法如下:
entry_obj = Entry.objects.latest('pub_date)
entry_obj = Entry.objects.latest('pub_date', '-expire_date')
系統(tǒng)會按照 pub_date 字段進行排序,然后返回最近的一條數(shù)據(jù)。
注意:這個操作和 get() 方法一樣,如果表里不存在數(shù)據(jù),使用 latest() 函數(shù)就會報錯。
處理 null 值
不同的數(shù)據(jù)庫對 null 值的處理是不一樣的,mysql 對 null 的排序會比非null值更高,
所以,在 mysql 中如果想排除掉 null 值,可以在 filter() 中去除這些數(shù)據(jù):
Entry.objects.filter(pub_date__isnull=False).latest('pub_date')
latest() 是返回最新的一條數(shù)據(jù)
earliest() 則是返回最舊的一條數(shù)據(jù)。
4、first、last
返回符合條件的第一條數(shù)據(jù):
Entry.objects.first()
也可以加上filter 和 排序條件:
entry = Entry.objects.filter(id__gte=12).order_by("pub_date").first()
注意:?如果沒有符合條件的數(shù)據(jù),返回的結(jié)果可能是 None
last() 則是返回最后一條數(shù)據(jù)。