Django小技巧17: QuerySets的latest和earliest方法
Posted November 05, 2018
就像QuerySets的first和last方法一樣, Django 還提供了earliest
和latest
方法. 用於獲取最早和最新的數據,增強代碼的可讀性.
最好在模型的Meta類中先定義get_latest_by
屬性
class Post(models.Model): headline = models.CharField(max_length=150) author = models.ForeignKey(User, on_delete=models.CASCADE) publication_date = models.DateTimeField(blank=True, null=True) change_date = models.DateTimeField(blank=True, null=True) class Meta: get_latest_by = 'publication_date'
然後使用起來非常簡單
latest_post = Post.objects.latest() earliest_post = Post.objects.earliest()
如果沒有指定get_latest_by
字段, 也可以通過參數來指定
latest_change = Post.objects.latest('change_date')
如果以上兩種方式都沒有提供get_latest_by
參數, 將會觸發DoesNotExist
錯誤. 它於 first 和 last 不同, 因爲first和 last 在沒有匹配到結果的情況下將會返回 None.
另外一個需要注意的點是, 和日期作爲排序參數的時候, 可能會遇到日期爲空的情況, 這時候工作的結果和我們想象的不一致。 所以我們可以過濾下日期爲 Null 的結果,再做earliest
和latest
檢索.
Post.objects.filter(change_date__isnull=False).latest('change_date')
這兩種方法, 通常與DateField
、DateTimeField
或IntegerField
一起使用。應該避免和其他字段一起使用, 因爲語義上是錯誤的。這兩種方法主要是提供代碼的方便性和可讀性, 如果和非時間字段一起使用,會帶來新的混淆.