深入了解 Django ORM 不等於

一、基本概念

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-hant/n/145901.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LZCN的頭像LZCN
上一篇 2024-10-29 18:58
下一篇 2024-10-29 18:58

相關推薦

  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • ORM持久層

    ORM(對象關係映射)是一種編程技術,它將面向對象的編程語言中的對象與關係型數據庫中的表進行映射。通過ORM,我們可以用面向對象的方式操作數據庫,減少了手寫SQL語句的複雜度以及對…

    編程 2025-04-28
  • Python中的不等於

    本文將從多個方面詳細闡述Python中的不等於符號,幫助讀者更好地理解、掌握該符號的使用。 一、不等於符號的含義 在Python中,不等於符號用 “!=” 表示。該符號是用來判斷兩…

    編程 2025-04-27
  • Gino FastAPI實現高效低耗ORM

    本文將從以下多個方面詳細闡述Gino FastAPI的優點與使用,展現其實現高效低耗ORM的能力。 一、快速入門 首先,我們需要在項目中安裝Gino FastAPI: pip in…

    編程 2025-04-27
  • Django項目中執行Python腳本

    本文將闡述在Django項目中如何執行Python腳本以及執行腳本的幾種方式。 一、subprocess模塊執行Python腳本 subprocess模塊提供了一個簡單的接口用於創…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • Python Django Channels用法介紹

    本文將從多個方面對Python Django Channels進行詳細的講解,包括介紹、使用、優缺點以及實際應用等,幫助大家更好地理解和應用Python Django Channe…

    編程 2025-04-25

發表回復

登錄後才能評論