Django學習之旅--第13課:Django模型關系進階與查詢優化實戰

在Django開發中,模型關系設計與查詢性能直接決定了系統的擴展性和效率。當業務場景從簡單的數據存儲升級為復雜的關聯分析(如訂單統計、用戶行為分析)時,基礎的模型關系和查詢方式已無法滿足需求。本節課將深入講解模型關系的高級用法、復雜查詢技巧與性能優化策略,通過實戰案例展示如何設計靈活的關聯結構并高效處理數據關聯操作。

一、模型關系高級用法

Django的模型關系(外鍵、多對多、一對一)是構建復雜數據結構的基礎,掌握其高級配置能顯著提升數據模型的靈活性。

1.1 外鍵關系(ForeignKey)深度應用

外鍵用于關聯兩個模型(如Order關聯Service),通過自定義配置可實現更精細的關系管理。

1.1.1 自定義反向查詢名稱

默認情況下,外鍵的反向查詢名稱為模型名_set(如service.order_set.all()),通過related_name可自定義更直觀的名稱:

# orders/models.py
from django.db import models
from services.models import Serviceclass Order(models.Model):service = models.ForeignKey(Service,on_delete=models.CASCADE,related_name='orders',  # 自定義反向名稱:service.orders.all()verbose_name="關聯服務")# 其他字段:用戶、價格、狀態等user = models.ForeignKey('users.User', on_delete=models.CASCADE)total_price = models.DecimalField(max_digits=10, decimal_places=2)status = models.CharField(max_length=1, choices=[('P', '待支付'), ('O', '處理中'), ('C', '已完成')])# 使用示例:查詢某個服務的所有訂單
service = Service.objects.get(id=1)
orders = service.orders.filter(status='C')  # 直接通過related_name查詢

優勢:反向查詢更直觀,代碼可讀性更高(service.ordersservice.order_set更易理解)。

1.1.2 級聯刪除策略

外鍵的on_delete參數控制當主表記錄被刪除時,關聯表的行為。不同場景需選擇不同策略:

策略描述適用場景
CASCADE刪除主對象時,關聯對象一并刪除訂單關聯服務:服務刪除后,關聯的歷史訂單無意義,應一并刪除
PROTECT阻止刪除主對象(觸發ProtectedError服務關聯分類:分類有服務時不允許刪除,避免數據孤立
SET_NULL外鍵設為NULL(需設置null=True用戶關聯頭像:用戶刪除后,頭像記錄保留但關聯用戶設為NULL
SET_DEFAULT外鍵設為默認值(需設置default訂單關聯優惠:優惠刪除后,訂單優惠設為"無優惠"默認值
SET(func)外鍵設為函數返回值動態獲取默認值(如關聯最新的替代服務)
DO_NOTHING不做任何操作(依賴數據庫約束)需數據庫級聯控制的特殊場景(謹慎使用)

示例:保護分類不被隨意刪除(避免服務關聯的分類丟失):

# services/models.py
class Category(models.Model):name = models.CharField(max_length=50, unique=True)class Service(models.Model):category = models.ForeignKey(Category,on_delete=models.PROTECT,  # 分類有服務時禁止刪除related_name='services')# 其他字段...

1.2 多對多關系(ManyToManyField)高級配置

多對多關系用于兩個模型的多向關聯(如ServiceTag),默認通過中間表維護關系,復雜場景可自定義中間模型存儲額外關聯信息。

1.2.1 使用中間模型存儲關聯信息

默認的多對多關系僅記錄關聯,若需存儲"誰添加的標簽"、"添加時間"等信息,需通過through指定中間模型:

# services/models.py
from django.db import models
from django.contrib.auth.models import Userclass Service(models.Model):name = models.CharField(max_length=200)# 多對多關聯標簽,通過ServiceTag中間模型tags = models.ManyToManyField('Tag',through='ServiceTag',  # 指定中間模型through_fields=('service', 'tag'),  # 中間模型的外鍵字段related_name='services')class Tag(models.Model):name = models.CharField(max_length=50, unique=True)  # 標簽名唯一# 中間模型:存儲關聯的額外信息
class ServiceTag(models.Model):service = models.ForeignKey(Service, on_delete=models.CASCADE)  # 關聯服務tag = models.ForeignKey(Tag, on_delete=models.CASCADE)  # 關聯標簽added_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)  # 誰添加的added_at = models.DateTimeField(auto_now_add=True)  # 添加時間class Meta:unique_together = ('service', 'tag')  # 避免服務重復關聯同一標簽

使用中間模型操作關聯

# 添加標簽(含添加人信息)
service = Service.objects.get(id=1)
tag = Tag.objects.get(name="設計")
ServiceTag.objects.create(service=service,tag=tag,added_by=request.user  # 記錄操作人
)# 查詢服務的標簽及添加信息
service_tags = ServiceTag.objects.filter(service=service
).select_related('tag', 'added_by')
for st in service_tags:print(f"標簽: {st.tag.name}, 添加人: {st.added_by.username}")

1.3 一對一關系(OneToOneField)應用場景

一對一關系用于兩個模型的唯一關聯(如UserUserProfile),常見于擴展用戶信息或拆分復雜模型。

1.3.1 擴展用戶模型

Django內置User模型字段有限,通過一對一關系可擴展用戶資料(不修改原模型):

# users/models.py
from django.db import models
from django.contrib.auth.models import Userclass UserProfile(models.Model):# 一對一關聯User,用戶刪除時資料也刪除user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile'  # 反向查詢:user.profile)bio = models.TextField(blank=True)  # 個人簡介website = models.URLField(blank=True)  # 個人網站social_media = models.JSONField(default=dict)  # 社交媒體賬號(JSON格式)# 使用示例:獲取用戶的擴展資料
user = User.objects.get(username="test")
print(user.profile.bio)  # 直接通過related_name訪問
1.3.2 代理模型(Proxy Model)

若需為模型添加額外方法但不修改表結構,可使用代理模型(不創建新表,僅擴展功能):

# users/models.py
class PremiumUser(User):class Meta:proxy = True  # 聲明為代理模型(不創建新表)def get_premium_discount(self):""" premium用戶專屬折扣計算 """return 0.8  # 8折優惠# 使用示例:對普通User實例調用代理模型方法
user = User.objects.get(username="premium_user")
premium_user = PremiumUser.objects.get(username="premium_user")
print(premium_user.get_premium_discount())  # 0.8

二、復雜查詢技巧

當業務需求涉及多條件篩選、字段比較或關聯判斷時,基礎的filter()已無法滿足,需使用Q對象F表達式子查詢等高級工具。

2.1 Q對象:組合復雜條件

Q對象用于構建AND/OR邏輯的復雜查詢條件(基礎filter()僅支持AND):

from django.db.models import Q
from services.models import Service# 示例1:查找價格低于1000元 或 高于5000元的服務
cheap_or_expensive = Service.objects.filter(Q(price__lt=1000) | Q(price__gt=5000)  # OR邏輯
)# 示例2:查找"設計"類服務(價格500-2000元) 或 "開發"類服務
design_or_dev = Service.objects.filter((Q(name__icontains="設計") & Q(price__gte=500) & Q(price__lte=2000)) |  # AND組合Q(category__code="DV")  # 分類為"開發"
)

注意Q對象需導入from django.db.models import Q,且|表示OR&表示AND~表示NOT

2.2 F表達式:字段間比較

F表達式用于模型字段間的比較(如"折扣價低于原價的80%"),避免Python層面的二次查詢:

from django.db.models import F
from services.models import Service# 示例1:查找折扣價 < 原價*0.8 的服務
discounted_services = Service.objects.filter(discount_price__lt=F('price') * 0.8  # F('price')表示引用自身price字段
)# 示例2:批量更新訂單總價(含100元服務費)
from orders.models import Order
Order.objects.filter(status='P').update(total_price=F('service__price') + 100  # 引用關聯模型的price字段
)

優勢F表達式直接在數據庫層面執行計算,避免先查詢再更新的"競態條件"(如多用戶同時操作時的數據不一致)。

2.3 子查詢與Exists:關聯存在性判斷

當需要判斷"是否存在關聯記錄"(如"有訂單的服務"、“有5星評價的服務”)時,使用Exists子查詢更高效:

from django.db.models import Exists, OuterRef
from services.models import Service
from orders.models import Order
from reviews.models import Review# 示例1:查找有訂單的服務(比service.orders.exists()更高效)
services_with_orders = Service.objects.filter(Exists(Order.objects.filter(service_id=OuterRef('id')))  # 子查詢:訂單的service_id=服務id
)# 示例2:查找有5星評價的服務
services_with_5star = Service.objects.filter(Exists(Review.objects.filter(service_id=OuterRef('id'),rating=5  # 評分=5))
)

優勢Exists僅判斷存在性,不返回具體關聯數據,比annotate(count=Count('reviews'))更高效。

三、聚合與注解:數據分析基礎

聚合(aggregate)和注解(annotate)是處理數據統計的核心工具:聚合用于計算全局匯總值(如"平均價格"),注解用于為每個對象添加計算字段(如"每個服務的訂單數")。

3.1 基本聚合函數

常用聚合函數:Count(計數)、Avg(平均值)、Sum(總和)、Max(最大值)、Min(最小值)。

from django.db.models import Count, Avg, Sum, Max, Min
from services.models import Service# 示例1:全局統計
stats = Service.objects.aggregate(total=Count('id'),  # 服務總數avg_price=Avg('price'),  # 平均價格max_price=Max('price'),  # 最高價格total_revenue=Sum('orders__total_price')  # 關聯訂單的總銷售額
)
# stats結果:{'total': 100, 'avg_price': 1500.0, ...}# 示例2:單值聚合(如服務總數)
service_count = Service.objects.count()  # 等價于Service.objects.aggregate(c=Count('id'))['c']

3.2 分組聚合(按字段分組統計)

通過values()指定分組字段,結合annotate()實現分組統計(如"按分類統計服務數量"):

# 按分類統計服務數量和平均價格
from django.db.models import Count, Avgcategory_stats = Service.objects.values('category__name')  # 按分類名稱分組.annotate(service_count=Count('id'),  # 每組的服務數avg_price=Avg('price')  # 每組的平均價格).order_by('-service_count')  # 按服務數降序# 結果示例:
# [
#   {'category__name': '設計', 'service_count': 30, 'avg_price': 1200.0},
#   {'category__name': '開發', 'service_count': 25, 'avg_price': 2000.0},
#   ...
# ]

關鍵values()必須放在annotate()之前,用于指定分組字段;annotate()為每個分組添加統計字段。

3.3 條件聚合(按條件統計)

使用CaseWhen實現條件統計(如"統計不同狀態的訂單數量"):

from django.db.models import Case, When, IntegerField, Sum, Count
from orders.models import Order# 示例1:統計不同狀態的訂單數量
status_counts = Order.objects.aggregate(pending=Sum(Case(When(status='P', then=1), output_field=IntegerField())),processing=Sum(Case(When(status='O', then=1), output_field=IntegerField())),completed=Sum(Case(When(status='C', then=1), output_field=IntegerField()))
)
# 結果:{'pending': 20, 'processing': 15, 'completed': 100}# 示例2:按價格區間分組統計服務數量
price_ranges = Service.objects.annotate(range=Case(When(price__lt=1000, then='低價'),When(price__gte=1000, price__lt=5000, then='中價'),When(price__gte=5000, then='高價'),default='未知',output_field=models.CharField())
).values('range').annotate(count=Count('id'))
# 結果:[{'range': '低價', 'count': 40}, ...]

四、查詢性能優化:避免N+1問題

關聯查詢時,若不優化會導致"N+1查詢問題"(1次查主表,N次查關聯表),通過select_relatedprefetch_related可顯著提升效率。

4.1 select_related:優化一對一/外鍵關聯

select_related通過SQLJOIN一次性加載主表和關聯表數據,適用于一對一外鍵關系(多對一):

# 優化前:查詢10個訂單,每個訂單訪問service會觸發1次查詢(共11次)
orders = Order.objects.all()[:10]
for order in orders:print(order.service.name)  # 每次循環觸發新查詢# 優化后:1次查詢加載所有訂單及關聯服務(共1次)
orders = Order.objects.select_related('service')[:10]  # 預加載外鍵關聯
for order in orders:print(order.service.name)  # 無額外查詢

支持多層關聯

# 預加載"訂單→服務→服務商"多層關聯
orders = Order.objects.select_related('service',  # 第一層:訂單關聯的服務'service__provider'  # 第二層:服務關聯的服務商
)[:10]
# 訪問多層關聯無額外查詢
for order in orders:print(order.service.provider.name)

4.2 prefetch_related:優化多對多/反向關聯

prefetch_related通過Python代碼合并查詢結果,適用于多對多反向關聯(如"服務的所有標簽"、“服務的所有訂單”):

# 優化前:查詢10個服務,每個服務訪問tags觸發1次查詢(共11次)
services = Service.objects.all()[:10]
for service in services:print([tag.name for tag in service.tags.all()])  # 每次循環觸發新查詢# 優化后:2次查詢(服務+標簽)
services = Service.objects.prefetch_related('tags')[:10]  # 預加載多對多關聯
for service in services:print([tag.name for tag in service.tags.all()])  # 無額外查詢

自定義預取條件

from django.db.models import Prefetch# 僅預加載"已完成"狀態的訂單
services = Service.objects.prefetch_related(Prefetch('orders',  # 關聯名稱queryset=Order.objects.filter(status='C'),  # 篩選條件to_attr='completed_orders'  # 自定義屬性名(默認是orders))
)[:10]# 使用自定義屬性
for service in services:print(f"已完成訂單數:{len(service.completed_orders)}")

五、實戰:訂單分析系統

結合模型關系和查詢技巧,實現一個訂單數據分析系統,包括分類銷售額統計、服務商排名和月度報告。

5.1 按服務類別統計銷售額

# analytics/views.py
from django.db.models import Sum, F, Count
from django.shortcuts import render
from services.models import Servicedef category_sales(request):# 按分類統計銷售額、訂單數categories = Service.objects.values('category__name').annotate(total_sales=Sum(F('orders__total_price')),  # 分類總銷售額order_count=Count('orders')  # 分類總訂單數).filter(total_sales__gt=0)  # 排除無銷售的分類.order_by('-total_sales')  # 按銷售額降序# 計算總銷售額和各分類占比total_sales = sum(cat['total_sales'] for cat in categories)for cat in categories:cat['percentage'] = round(cat['total_sales'] / total_sales * 100, 1)  # 占比(%)return render(request, 'analytics/category_sales.html', {'categories': categories,'total_sales': total_sales})

模板展示:通過表格或餅圖展示各分類銷售額及占比,幫助商家了解熱門分類。

5.2 服務商收入排名

# analytics/views.py
from django.db.models import Sum, Count
from django.shortcuts import render
from users.models import Userdef provider_ranking(request):# 服務商收入排名(取前10)providers = User.objects.filter(is_service_provider=True  # 篩選服務商用戶).annotate(total_income=Sum('services__orders__total_price'),  # 總收入order_count=Count('services__orders')  # 總訂單數).filter(total_income__gt=0  # 排除無收入的服務商).order_by('-total_income')[:10]  # 按收入降序return render(request, 'analytics/provider_ranking.html', {'providers': providers})

5.3 月度銷售報告(含環比增長)

# analytics/views.py
from django.db.models import Sum, Count
from django.db.models.functions import TruncMonth
from django.shortcuts import render
from orders.models import Orderdef monthly_sales_report(request):# 按月統計銷售額和訂單數monthly_sales = Order.objects.annotate(month=TruncMonth('created_at')  # 按月份分組(截斷到月份)).values('month').annotate(total_sales=Sum('total_price'),  # 月度銷售額order_count=Count('id')  # 月度訂單數).order_by('-month')  # 按月份降序# 計算環比增長率(當前月較上月的增長百分比)prev_sales = Nonefor month in monthly_sales:if prev_sales:# 增長率 = (當前銷售額 - 上月銷售額) / 上月銷售額 * 100%month['growth_rate'] = round((month['total_sales'] - prev_sales) / prev_sales * 100, 1)else:month['growth_rate'] = None  # 第一個月無增長率prev_sales = month['total_sales']return render(request, 'analytics/monthly_report.html', {'monthly_sales': monthly_sales})

六、高級關系設計模式

針對特殊業務場景,Django支持自關聯、通用關系和多表繼承等高級設計模式,滿足復雜數據結構需求。

6.1 自關聯:模型關聯自身

適用于"父子關系"場景(如"服務套餐包含子服務"、“評論的回復”):

# services/models.py
class ServicePackage(models.Model):name = models.CharField(max_length=100)price = models.DecimalField(max_digits=10, decimal_places=2)# 自關聯:套餐可包含子套餐(外鍵指向自身)parent = models.ForeignKey('self',on_delete=models.CASCADE,related_name='sub_packages',null=True,blank=True)# 使用示例:查詢套餐的所有子套餐
package = ServicePackage.objects.get(name="高級設計套餐")
sub_packages = package.sub_packages.all()  # 通過related_name查詢子套餐

6.2 通用關系:關聯任意模型

當需要為多個模型添加通用功能(如"評論"可關聯"服務"、“訂單”、“案例”)時,使用GenericForeignKey

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentTypeclass Comment(models.Model):# 通用關聯的核心字段content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # 關聯模型類型object_id = models.PositiveIntegerField()  # 關聯模型的IDcontent_object = GenericForeignKey('content_type', 'object_id')  # 通用外鍵# 評論內容text = models.TextField()created_at = models.DateTimeField(auto_now_add=True)# 使用示例:為服務和訂單添加評論
service = Service.objects.get(id=1)
order = Order.objects.get(id=1)# 給服務添加評論
Comment.objects.create(content_object=service,text="這個服務很棒!"
)# 給訂單添加評論
Comment.objects.create(content_object=order,text="訂單處理很快"
)# 查詢服務的所有評論
service_comments = Comment.objects.filter(content_type=ContentType.objects.get_for_model(Service),object_id=service.id
)

七、性能優化實踐

除了查詢優化,還可通過工具監控、批量操作和索引優化進一步提升性能。

7.1 使用django-query-profiler監控查詢

django-query-profiler可記錄查詢次數、耗時和堆棧信息,幫助定位慢查詢:

# 安裝
pip install django-query-profiler
# settings.py
MIDDLEWARE = [# ...其他中間件'query_profiler.middleware.QueryProfilerMiddleware',  # 添加監控中間件
]QUERY_PROFILER = {'SHOW_TRACEBACKS': True,  # 顯示查詢堆棧'TRACEBACK_ROOT': BASE_DIR,  # 項目根目錄
}

訪問頁面時,控制臺會輸出查詢詳情(次數、耗時、SQL語句),便于針對性優化。

7.2 批量操作減少數據庫交互

使用bulk_createbulk_update批量處理數據,減少數據庫請求次數:

# 批量創建標簽關聯(1次請求替代N次)
from services.models import ServiceTag# 準備數據
tag_relations = [ServiceTag(service=service1, tag=tag1, added_by=user),ServiceTag(service=service1, tag=tag2, added_by=user),ServiceTag(service=service2, tag=tag1, added_by=user),
]# 批量創建
ServiceTag.objects.bulk_create(tag_relations)# 批量更新(如批量設置服務為"推薦")
from services.models import Service
services = Service.objects.filter(category__code="DV")
for service in services:service.is_featured = True
Service.objects.bulk_update(services, ['is_featured'])  # 僅更新指定字段

7.3 索引優化:加速查詢

為頻繁篩選、排序的字段添加索引,減少數據庫掃描時間:

# services/models.py
class Service(models.Model):# 對頻繁篩選的字段添加索引name = models.CharField(max_length=200, db_index=True)  # 頻繁搜索created_at = models.DateTimeField(auto_now_add=True, db_index=True)  # 頻繁排序price = models.DecimalField(max_digits=10, decimal_places=2, db_index=True)  # 頻繁篩選class Meta:# 復合索引:優化多字段聯合查詢(如按狀態+創建時間篩選)indexes = [models.Index(fields=['is_active', 'created_at']),]

八、總結與實戰任務

本節課深入講解了模型關系的高級配置、復雜查詢技巧與性能優化策略,核心成果包括:

  • ? 掌握外鍵、多對多、一對一關系的高級用法(反向名稱、中間模型、級聯策略);
  • ? 學會使用Q對象、F表達式、子查詢處理復雜條件;
  • ? 通過聚合與注解實現數據分析;
  • ? 用select_related/prefetch_related解決N+1查詢問題;
  • ? 設計高級關系模式(自關聯、通用關系)。

實戰任務

  1. 服務標簽系統:實現服務與標簽的多對多關系,支持標簽篩選和熱門標簽云展示;
  2. 推薦系統:基于服務標簽相似度推薦相關服務,結合用戶訂單歷史推薦個性化內容;
  3. 數據分析儀表盤:集成銷售趨勢圖、用戶增長曲線,支持數據導出為Excel。

下一課預告:將學習Django Admin后臺的精進技巧,打造專業的管理界面,進一步提升數據管理效率。

通過本節課的學習,你已具備設計復雜數據模型和高效處理關聯查詢的能力,這是構建企業級Django應用的核心競爭力。在實際項目中,需結合業務場景靈活選擇關系類型和查詢方式,并持續通過工具監控和優化性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90233.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90233.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90233.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單理解現代Web應用架構:從簡單到企業級

在開發Web應用程序時&#xff0c;理解如何構建一個既安全又高效的系統至關重要。本文將通過介紹從簡單的三層架構到復雜的企業級架構的演變過程&#xff0c;幫助您更好地理解這些概念。1. 基礎架構&#xff1a;React Node.js MySQL前端&#xff08;React&#xff09;&#xf…

修改 Lucide-React 圖標樣式的方法

修改 Lucide-React 圖標樣式的方法 使用 lucide-react 時&#xff0c;你可以通過多種方式修改圖標的樣式。以下是幾種常用的方法&#xff1a; 1. 通過 className 屬性 import { Home } from lucide-react;function MyComponent() {return <Home className"text-blue-50…

神經架構搜索革命:從動態搜索到高性能LLM的蛻變之路

本文將揭示如何通過神經架構搜索技術&#xff08;NAS&#xff09;自動發現最優網絡結構&#xff0c;并將搜索結果轉化為新一代高性能大型語言模型的核心技術。我們的實驗證明&#xff0c;該方法在同等計算資源下可實現80%的性能飛躍&#xff01;第一部分&#xff1a;神經架構搜…

【LeetCode 熱題 100】78. 子集——(解法三)位運算

Problem: 78. 子集 題目&#xff1a;給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1…

XCKU035?1SFVA784C Xilinx FPGA KintexUltraScale AMD

XCKU035?1SFVA784C 屬于 Xilinx Kintex UltraScale 系列&#xff0c;基于領先的 20?nm FinFET 技術制程&#xff0c;旨在為中高端應用提供卓越的性能與功耗平衡。該器件采用 784?ball Fine?pitch BGA&#xff08;SFVA784&#xff09;封裝&#xff0c;速度等級?1&#xff0…

Encore.ts:下一代高性能 TypeScript 后端框架的崛起

在 Node.js 生態系統中&#xff0c;后端框架的選擇直接影響 API 的性能、開發體驗和可維護性。近年來&#xff0c;Elysia.js、Hono、Fastify 等框架憑借各自的優化策略嶄露頭角&#xff0c;而 Encore.ts 則憑借 Rust TypeScript 混合架構&#xff0c;在性能上實現了質的飛躍。…

【IP地址】IP歸屬地查詢驅動企業實時戰略調整

動態市場感知與資源調度優化? IP歸屬地的實時分析為企業提供了市場需求的動態變化圖。 基于實時數據處理框架&#xff0c;企業可將IP歸屬地數據與用戶訪問量、轉化率等指標關聯計算&#xff0c;生成區域市場活躍度熱力圖。 當某區域IP訪問量在1小時內激增300%且停留時長提升至…

[Bug | Cursor] import error: No module named ‘data‘

import error: No module named ‘data’ Folder Structure root folder data folder dataloader.py src folder train.py <- where we try to import the dataloader.pyFailed Script ROOT_DIR Path(__file__).parent.parent os.chdir(ROOT_DIR) print(f"Using root…

#Linux權限管理:從“Permission denied“到系統安全大師

引入 Linux 作為多用戶系統&#xff0c;權限是系統安全的第一道防線。不合理的權限設置可能導致&#xff1a; 敏感文件泄露&#xff08;如數據庫密碼被讀取&#xff09;誤刪核心數據&#xff08;目錄寫權限失控&#xff09;權限漏洞被利用&#xff08;如 SUID 提權攻擊&#…

電腦重置一次對電腦傷害大嗎

在日常使用電腦的過程中&#xff0c;很多用戶或多或少都遇到過系統卡頓、軟件沖突、病毒入侵等問題。當電腦變得“越來越慢”或頻繁出錯時&#xff0c;一些用戶會考慮“重置電腦”&#xff0c;也就是將電腦恢復到出廠設置。但不少人心中也有疑問&#xff1a;重置電腦一次&#…

CSP-J系列【2024】P11229 [CSP-J 2024] 小木棍題解

題目描述小 S 喜歡收集小木棍。在收集了 n 根長度相等的小木棍之后&#xff0c;他閑來無事&#xff0c;便用它們拼起了數字。用小木棍拼每種數字的方法如下圖所示。現在小 S 希望拼出一個正整數&#xff0c;滿足如下條件&#xff1a;拼出這個數恰好使用 n 根小木棍&#xff1b;…

C# 繼承 虛方法

繼承 虛方法 &#xff08;重寫&#xff09; virtual 虛方法的關鍵字 override 重寫的關鍵字 練習&#xff1a; 繼承 繼承&#xff1a;很多類有相似的數據 相同的屬性 相同的方法 也有不同的 這個時候就可以使用繼承 讓多個類去繼承自某個具有相同數據的基類(父類) 這…

Java 堆(優先級隊列)

文章目錄優先級隊列模擬實現優先級隊列向下調整建堆向上調整建堆堆的刪除priorityQueue構造方法大根堆和小根堆的向上調整比較方法擴容面試題堆排序優先級隊列 priorityqueue&#xff1a;底層是一顆完全二叉樹 小根堆&#xff1a;根比左右孩子都小大根堆&#xff1a;根比左右…

在.NET Core API 微服務中使用 gRPC:從通信模式到場景選型

目錄 一、gRPC 基礎&#xff1a;為什么它適合微服務&#xff1f; 二、gRPC 的四種通信模式及.NET Core 實現 1. 一元 RPC&#xff08;Unary RPC&#xff09;&#xff1a;最基礎的請求 - 響應模式 2. 服務器流式 RPC&#xff08;Server Streaming RPC&#xff09;&#xff1…

HTML零基礎快速入門教程(詳細篇)

本文詳細介紹HTML零基礎快速入門的基礎知識&#xff0c;包括HTML的介紹、語言的一些實際作用、語法規范注意&#xff0c;如標簽結構、標簽屬性、大小寫不敏感等&#xff0c;還介紹了HTML文件的具體書寫規則&#xff0c;如文件擴展名、文檔類型聲明和HTML結構以及具體的一些HTML…

LLM評測框架Ragas:SQL指標(解決了Ollama推理框架不支持的問題)

SQL類的度量指標是指運行SQL后的結果和預期之間的一個度量值。 datacompy score datacompy score 使用DataCompy(一個比較pandas的數據格式的python類,所以需要按照datacompy:pip install datacompy),默認是按照rows比較,也可以設置按照columns比較,這個事通過mode參數…

ubuntu24 ros2 jazzy

安裝2 software & update 選擇其它 安裝 一、前提準備 檢查操作系統版本&#xff1a; 確保你的系統版本是Ubuntu 24.04。你可以通過運行lsb_release -a命令來檢查當前的系統版本。 設置UTF-8支持&#xff1a; ROS 2需要UTF-8編碼支持。你可以通過以下命令來檢查和設置UTF…

設備虛擬化技術

設備虛擬化技術概述設備虛擬化技術通過軟件模擬物理硬件設備&#xff0c;使多個操作系統或應用程序能夠共享同一臺物理設備。它廣泛應用于云計算、服務器整合和測試環境等領域。核心目標是提高資源利用率、隔離性和靈活性。?當接入的用戶數增加到原交換機端口密度不能滿足接入…

開發避坑短篇(3):解決@vitejs plugin-vue@5.0.5對Vite^5.0.0的依賴沖突

異常信息 # npm resolution error reportWhile resolving:system3.8.8 Found: vite6.2.3 node_modules/vitedev vite"6.2.3" from the root projectCould not resolve dependency: peer vite"^5.0.0" from vitejs/plugin-vue5.0.5 node_modules/vitejs/plu…

k8s快速部署(親測無坑)

文章目錄k8s快速部署&#xff08;親測無坑&#xff09;一、網絡劃分二、CentOS7設置 標題固定IP和阿里云YUM源三、主機環境配置四、虛擬機的拷貝五、安裝docker(每臺主機都需要安裝)六、安裝kubelet,kubeadm,kubectl(每臺機器都需要執行)遇到的問題參考文檔k8s快速部署&#xf…