1. 程式人生 > 程式設計 >django-orm F物件的使用 按照兩個欄位的和,乘積排序例項

django-orm F物件的使用 按照兩個欄位的和,乘積排序例項

class F

F()是代表模型欄位的值,也就是說對於一些特殊的欄位的操作,我們不需要資料先取到記憶體中,然後操作,在儲存到db中了。

以下為幾個使用的經典場景:

1. 統計點選量,點贊(每次加1)

from django.db.models import F
Reporters.objects.filter(id=case_id).update(thumb_num=F('thumb_num') + 1)

2.一個合同欄位,結束日期和終止日期的比較很容易實現 終止日期小於結束日期

from django.db.models import F

contract_list = Contracts.objects.filter(contract_stop_time__lt=F('contract_end_time'))

3.如果說按照兩個欄位的和,乘積,差進行排序,用F類是最好的解決方法,這樣不必要再新增一個欄位了

# 按照總價逆序取前十個
goods_list = Goods.objects.all( ).order_by( F('num') * F('unit_price') ).reversed( )[ :10] 

# 按照點贊與評論數和進行排序
hot_list = Article.objects.all( ).order_by( F('thumb_num') + F('comment_num') ).reversed( )

總的來說,F物件支援對資料的算術運算,還有時間比較操作,真的是query利器。

補充知識:Django查詢資料庫時各種種類的排序

按照entry_date從小到大查詢資料,可以寫成:

Content.objects.order_by('entry_date')

從大到小排序:

Content.objects.order_by('-entry_date')

下面介紹其他種類的排序

隨機排序:

Content.objects.order_by('?')

但是order_by(?)這種方式也許expensive並且slow,這取決於後端資料庫。

按照關係表的欄位排序

class Category(Base):
 code = models.CharField(primary_key=True,max_length=100)
 title = models.CharField(max_length = 255)
class Content(Base):
 title = models.CharField(max_length=255)
 description = models.TextField()
 category = models.ForeignKey(Category,on_delete=models.CASCADE)
# 按照Category的欄位code,對Content進行排序,只需要外來鍵後加雙下劃線
Content.objects.order_by('category__title')
# 如果只是按照外來鍵來排序,會預設按照關聯的表的主鍵排序
Content.objects.order_by('category')
# 上面等價於
Content.objects.order_by('category__code')
# 雙下劃線返回的是join後的結果集,而單下劃線返回的是單個表的集合
Content.objects.order_by('category_title')

Note: 無論是單下劃線還是雙下劃線,我們都可用{{ content.category.title }}在前端獲取到關聯表的資料。

以上這篇django-orm F物件的使用 按照兩個欄位的和,乘積排序例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。