[英]django filter a prefetch_related queryset
我正在嘗試將 prefetch_related 與帶有外鍵的 model 一起使用,因為然后我需要在循環中查詢數據庫。
模型.py
class SelfEvaluatedStatement(models.Model):
evaluation_statement = models.ForeignKey(EvaluationStatement, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
rating = models.IntegerField(default=0)
視圖.py
queryset = SelfEvaluatedStatement.objects.prefetch_related(
'evaluation_statement__sku__topic__subject', 'evaluation_statement__sku__level'
).filter(
evaluation_statement__sku__topic__subject=subject,
evaluation_statement__sku__level=level
)
for student_user in student_users:
red_count = queryset.filter(user=student_user, rating=1).count()
但是,每次我遍歷循環時,都會使用新查詢訪問數據庫。 是否可以過濾已預取的查詢集,或者我是否錯誤地考慮了這一點?
所以我完全重新考慮了這一點。 不確定這是否一定是最好的解決方案,但它要快得多。 查詢如此緩慢的原因是因為過濾器有 2 個主鍵。 正在為 class 中的每個學生運行查詢,因此可能需要 20-30 次,這意味着它需要超過 30 秒。
解決方案
我將其全部簡化為在循環之前執行的單個查詢,並在該單個查詢中提取所有學生用戶的數據。 我將其轉換為值列表。
queryset = SelfEvaluatedStatement.objects.filter(
evaluation_statement__sku__topic__subject=subject,
evaluation_statement__sku__level=level,
user__in=student_users
)
my_values = list(queryset.values_list('user__username', 'rating'))
然后我使用 Python 來遍歷值列表,由於只有 1 個數據庫查詢,這個解決方案明顯更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.