2014-11-03 46 views
0

我有類似下面的數據庫關係:如何在django rest框架中將小型查詢與嵌套序列化器結合使用?

+-----------+ 
    | Container | 
    +-----------+ 
    | id  | 
    +-----------+ 
     | 
     |1..n 
+--------------+ 
| Child  | 
+--------------+ 
| id   | 
| container_id | 
+--------------+ 

我想窩在Container串行的Child的序列化,所以我可以在一個HTTP請求的兩個對象。但是,當我查詢Containers的列表時,Django REST Framework會執行一個查詢來獲取所有Containers,但隨後會爲與特定Container對象關聯的每個對象集Child執行一組單個查詢。這裏是我的玩具例子:

# Models 
class Container(models.Model): 
    pass 

class Child(models.Model): 
    container = models.ForeignKey(Container,related_name="children") 

# Serializers 
class ChildSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Child 
     fields = ('url','container') 

class ContainerSerializer(serializers.HyperlinkedModelSerializer): 
    children = ChildSerializer(many=True) 
    class Meta: 
     model = Container 
     fields = ('url','children') 

# Views 
class ContainerViewSet(viewsets.ModelViewSet) 
    queryset = Container.objects.all() 
    serializer_class = ContainerSerializer 

class ChildViewSet(viewsets.ModelViewSet) 
    queryset = Child.objects.all() 
    serializer_class = ChildSerializer 

有沒有辦法凝聚所有Child查詢到一個後臺查詢,然後分配結果Container對象之中?

回答

1

Django REST Framework不會爲您優化您的查詢,您需要決定如何最好地移除任何N + 1查詢。您應該遵循the Django documentation中的指導原則來處理性能問題。

對於ForeignKey關係,您應該在查詢中使用select_related,該查詢將預取原始查詢中的對象。

對於ManyToMany和GenericForeignKey關係,您應該使用prefetch_related。我在another Stack Overflow answer中寫了很多關於這方面的內容,但其要點是您使用它類似於select_related

爲了獲得最佳效果,您應該重寫視圖中的查詢get_queryset,因爲在用作類的屬性時,您不必擔心Django REST Framework錯誤地克隆查詢集。

相關問題