Django小技巧17: QuerySets的latest和earliest方法

Django小技巧17: QuerySets的latest和earliest方法

Posted November 05, 2018

翻譯整理自: simpleisbetterthancomplex.com

就像QuerySets的first和last方法一樣, Django 還提供了earliestlatest方法. 用於獲取最早和最新的數據,增強代碼的可讀性.

最好在模型的Meta類中先定義get_latest_by屬性

Python

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'

然後使用起來非常簡單

Python

latest_post = Post.objects.latest()
earliest_post = Post.objects.earliest()

如果沒有指定get_latest_by字段, 也可以通過參數來指定

Python

latest_change = Post.objects.latest('change_date')

如果以上兩種方式都沒有提供get_latest_by參數, 將會觸發DoesNotExist錯誤. 它於 first 和 last 不同, 因爲first和 last 在沒有匹配到結果的情況下將會返回 None.

另外一個需要注意的點是, 和日期作爲排序參數的時候, 可能會遇到日期爲空的情況, 這時候工作的結果和我們想象的不一致。 所以我們可以過濾下日期爲 Null 的結果,再做earliestlatest檢索.

Python

Post.objects.filter(change_date__isnull=False).latest('change_date')

這兩種方法, 通常與DateFieldDateTimeFieldIntegerField一起使用。應該避免和其他字段一起使用, 因爲語義上是錯誤的。這兩種方法主要是提供代碼的方便性和可讀性, 如果和非時間字段一起使用,會帶來新的混淆.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章