簡體   English   中英

django 過濾一個 prefetch_related 查詢集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM