如题所述
è§£å³ Django ãææ°ãçåºæ¬æ¹æ³
ç°å¨æ们解å³è¿ä¸ªé®é¢çæ¹æ³å°±æ¯ãé¢å è½½ããä»æ¬è´¨ä¸è®²ï¼å°±æ¯ä½ æåè¦å Django ORM ä½ è¦ä¸éåä¸éçåè¯å®åæ ·æ èçæ令ãå¨ä¸é¢çä¾åä¸ï¼å¨ DRF å¼å§è·ååå¾ç®åå°å ä¸è¿å¥è¯å°±æå®äºï¼
queryset = queryset.prefetch_related('orders')
å½ DRF è°ç¨ä¸è¿°ç¸ååºåå customers æ¶ï¼åºç°çæ¯è¿ç§æ åµï¼
è·åææ customers ï¼æ§è¡ä¸¤ä¸ªå¾è¿æ°æ®åºæä½ï¼ç¬¬ä¸ä¸ªæ¯è·å customersï¼ç¬¬äºä¸ªè·åç¸å ³ customers çææç¸å ³ç ordersãï¼
对äºç¬¬ä¸ä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼æ们已ç»å¨ä¸ä¸æ¥ä¸è·åäºæéè¦çæ°æ®ï¼
对äºç¬¬äºä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬ä¸ä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬å个è¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬äºä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬å 个è¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
ä½ åæè¯å°ï¼ä½ å¯ä»¥æäº å¾å¤ customers ï¼å·²ç»ä¸éè¦å继ç»çå¾ å»æ°æ®åºã
å ¶å® Django ORM çãé¢å¤ãæ¯å¨ç¬¬1æ¥è¿è¡è¯·æ±ï¼å®å¨æ¬å°é«éç¼åçæ°æ®è½å¤æä¾æ¥éª¤2+æè¦æ±çæ°æ®ãä¸ä¹åå¾è¿æ°æ®åºç¸æ¯ä»æ¬å°ç¼åæ°æ®ä¸è¯»åæ°æ®åºæ¬ä¸æ¯ç¬æ¶çï¼æ以æ们å¨æå¾å¤ customers æ¶å°±è·å¾äºå·¨å¤§çæ§è½å éã
è§£å³ Django REST Framework æ§è½é®é¢çæ åå模å¼
æ们已ç»ç¡®å®äºä¸ä¸ªä¼å Django REST Framework æ§è½é®é¢çéç¨æ¨¡å¼ï¼é£å°±æ¯æ¯å½åºååæ¥è¯¢åµå¥å段æ¶ï¼æ们就添å ä¸ä¸ªæ°ç @staticmethod åå« setup_eager_loading ï¼åè¿æ ·ï¼
class CustomerSerializer(serializers.ModelSerializer):
orders = OrderSerializer(many=True, read_only=True)
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('orders')
return queryset
è¿æ ·ï¼ä¸ç®¡åªéè¦ç¨å°è¿ä¸ªåºååï¼é½åªéå¨è°ç¨åºåååç®åè°ç¨ setup_eager_loading ï¼å°±åè¿æ ·ï¼
customer_qs = Customers.objects.all()
customer_qs = CustomerSerializer.setup_eager_loading(customer_qs) # Set up eager loading to avoid N+1 selects
post_data = CustomerSerializer(customer_qs, many=True).data
æè ï¼å¦æä½ æä¸ä¸ª APIView æ ViewSet ï¼ä½ å¯ä»¥å¨ get_queryset æ¹æ³éè°ç¨ setup_eager_loading ï¼
def get_queryset(self):
queryset = Customers.objects.all()
# Set up eager loading to avoid N+1 selects
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset
ç°å¨æ们解å³è¿ä¸ªé®é¢çæ¹æ³å°±æ¯ãé¢å è½½ããä»æ¬è´¨ä¸è®²ï¼å°±æ¯ä½ æåè¦å Django ORM ä½ è¦ä¸éåä¸éçåè¯å®åæ ·æ èçæ令ãå¨ä¸é¢çä¾åä¸ï¼å¨ DRF å¼å§è·ååå¾ç®åå°å ä¸è¿å¥è¯å°±æå®äºï¼
queryset = queryset.prefetch_related('orders')
å½ DRF è°ç¨ä¸è¿°ç¸ååºåå customers æ¶ï¼åºç°çæ¯è¿ç§æ åµï¼
è·åææ customers ï¼æ§è¡ä¸¤ä¸ªå¾è¿æ°æ®åºæä½ï¼ç¬¬ä¸ä¸ªæ¯è·å customersï¼ç¬¬äºä¸ªè·åç¸å ³ customers çææç¸å ³ç ordersãï¼
对äºç¬¬ä¸ä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼æ们已ç»å¨ä¸ä¸æ¥ä¸è·åäºæéè¦çæ°æ®ï¼
对äºç¬¬äºä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬ä¸ä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬å个è¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬äºä¸ªè¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
对äºç¬¬å 个è¿åç customersï¼è·åå ¶ order ï¼ä¸éè¦è®¿é®æ°æ®åºï¼
ä½ åæè¯å°ï¼ä½ å¯ä»¥æäº å¾å¤ customers ï¼å·²ç»ä¸éè¦å继ç»çå¾ å»æ°æ®åºã
å ¶å® Django ORM çãé¢å¤ãæ¯å¨ç¬¬1æ¥è¿è¡è¯·æ±ï¼å®å¨æ¬å°é«éç¼åçæ°æ®è½å¤æä¾æ¥éª¤2+æè¦æ±çæ°æ®ãä¸ä¹åå¾è¿æ°æ®åºç¸æ¯ä»æ¬å°ç¼åæ°æ®ä¸è¯»åæ°æ®åºæ¬ä¸æ¯ç¬æ¶çï¼æ以æ们å¨æå¾å¤ customers æ¶å°±è·å¾äºå·¨å¤§çæ§è½å éã
è§£å³ Django REST Framework æ§è½é®é¢çæ åå模å¼
æ们已ç»ç¡®å®äºä¸ä¸ªä¼å Django REST Framework æ§è½é®é¢çéç¨æ¨¡å¼ï¼é£å°±æ¯æ¯å½åºååæ¥è¯¢åµå¥å段æ¶ï¼æ们就添å ä¸ä¸ªæ°ç @staticmethod åå« setup_eager_loading ï¼åè¿æ ·ï¼
class CustomerSerializer(serializers.ModelSerializer):
orders = OrderSerializer(many=True, read_only=True)
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('orders')
return queryset
è¿æ ·ï¼ä¸ç®¡åªéè¦ç¨å°è¿ä¸ªåºååï¼é½åªéå¨è°ç¨åºåååç®åè°ç¨ setup_eager_loading ï¼å°±åè¿æ ·ï¼
customer_qs = Customers.objects.all()
customer_qs = CustomerSerializer.setup_eager_loading(customer_qs) # Set up eager loading to avoid N+1 selects
post_data = CustomerSerializer(customer_qs, many=True).data
æè ï¼å¦æä½ æä¸ä¸ª APIView æ ViewSet ï¼ä½ å¯ä»¥å¨ get_queryset æ¹æ³éè°ç¨ setup_eager_loading ï¼
def get_queryset(self):
queryset = Customers.objects.all()
# Set up eager loading to avoid N+1 selects
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset
温馨提示:答案为网友推荐,仅供参考