一、基本概念
Django ORM 是 Django 的一個內置模塊,全稱為「Object-Relational Mapping」,即將對象和關係型數據庫之間做映射,將以 Python 類的形式定義的模型映射成數據庫中對應的表。
首先,我們需要了解什麼是「不等於」。在模型查詢的時候,我們常常需要用到「不等於」來過濾數據,即將不符合條件的數據篩選掉。在 Django ORM 中,「不等於」有兩種基本的方式:
# 方式一: 使用 exclude() objects.exclude(param1=value1, param2__lt=value2) # 方式二: 使用 ~Q() from django.db.models import Q objects.filter(~Q(param1=value1) | Q(param2__lt=value2))
以上兩種方式等價,都可以用來過濾數據,而且並不只限於「不等於」,在更複雜的查詢中我們還可以使用 and、or 邏輯符號進行組合。
二、查詢複雜數據模型
當我們處理一些複雜的數據模型時,需要根據一些關聯模型的字段來查詢,而不是簡單以自身的字段為查詢條件。以一個圖書館系統為例,書籍 Book 與借閱記錄 BorrowedRecord 通過 Book 和 BorrowedRecord 中的外鍵關聯。如果我們想查詢最近借閱的書籍,則可以按照下面的方式進行:
from django.db.models import Max from .models import Book, BorrowedRecord latest_record = BorrowedRecord.objects.latest('borrowed_time') latest_books = Book.objects.filter( borrowedrecord__borrowed_time=latest_record.borrowed_time )
在這個例子中,我們使用了 Max 函數來獲取最近借閱記錄,接着使用雙下劃線 “__” 來表示外鍵關聯,最終查詢符合條件的書籍。
三、使用 F 表達式
我們知道,在 Django ORM 中使用與、或、非等條件時,Python 的 and、or、not 等邏輯符和 SQL 的 and、or、not 不完全相同,使用起來比較麻煩。此時 Django ORM 提供了一個 F 表達式來解決這個問題。F 表達式允許我們在查詢中引用模型中的字段,可以使代碼更加簡潔、易懂。舉個例子:
from django.db.models import F from .models import Book books = Book.objects.filter(num_available__lt=F('total_num'))
上述代碼中,我們使用 F 表達式來比較 num_available 和 total_num 兩個字段的大小關係,過濾出可借數量小於總數量的書籍。
四、使用聚合函數
在數據分析和統計時,聚合函數是必不可少的工具。Django ORM 提供了一些內置的聚合函數可以讓我們更方便地進行數據聚合操作。
以下代碼示例中,我們使用序列化器獲取所有價格大於 10 元的書籍的平均價格(Avg 函數)。
from django.db.models import Avg from rest_framework import serializers from .models import Book class BookSerializer(serializers.ModelSerializer): avg_price = serializers.SerializerMethodField() def get_avg_price(self, obj): return obj.price__avg() class Meta: model = Book fields = ('name', 'price', 'avg_price') books = Book.objects.filter(price__gt=10).annotate(avg_price=Avg('price')) serialized_books = BookSerializer(books, many=True).data
五、使用 subquery
有時候我們需要嵌套查詢,即在一個查詢中使用另一個查詢的結果。Django ORM 中可以使用子查詢來實現這個功能。以下代碼示例中,我們查詢所有借閱次數大於 10 次的書籍:
from django.db.models import OuterRef, Subquery from .models import Book, BorrowedRecord subquery = BorrowedRecord.objects.filter( book=OuterRef('pk') ).values('book').annotate(count=Count('pk')).values('count') books = Book.objects.annotate(count=Subquery(subquery)).filter(count__gt=10)
在這個例子中,我們使用 OuterRef 和 Subquery 兩個函數來定義子查詢,最終查詢出符合條件的書籍。
六、總結
以上就是 Django ORM 不等於的常用技巧,我們從基本概念、查詢複雜數據模型、使用 F 表達式、使用聚合函數以及使用子查詢等幾個方面進行了詳細的闡述。通過這篇文章,希望讀者可以更深入地了解 Django ORM 的用法,提高使用效率。
原創文章,作者:LZCN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/145901.html