2013-07-06 53 views
2

的比方說,我有這樣的模式:Django的REST的架構串行使得很多查詢

class Place(models.Model): 
    .... 
    owner = ForeignKey(CustomUserModel) 
    .... 

而且我有這個DRF串行器返回(視圖調用它使用DRF的generics.ListAPIViewPlace個列表):

class PlaceSerializer(serializers.ModelSerializer): 
    owner = UserModelSerializer() # Gets only specific fields for a place owner 

    class Meta: 
     model = Place 

的問題是,當串行得到一個返回查詢,讓我們說...... 50個地方,我可以看到(在connection.queries)一個查詢正在爲每個owner外鍵關係提出,總結到很多o f查詢。這當然對性能有很大的影響。

同樣重要的一點是,對於調用序列化程序的視圖,我有get_queryset()只返回Place s,它們使用自定義查詢與中心點保持一定的距離。我爲此使用了Django的extra()方法。

我已經嘗試使用select_relatedprefetch_related與上面提到的查詢,但它似乎沒有任何區別在序列化程序稍後進行的查詢方面。

我錯過了什麼?

回答

2

select_related將按照預期的方式與序列化程序一起工作。

如果您使用通用視圖,請確保您在視圖上的「queryset」屬性中設置該屬性。

在'get_queryset'中使用select_related也可以。

否則,我可以建議的唯一事情就是試圖縮小問題的範圍,並進行一些更多的調試。如果您仍然認爲存在問題並且有一個可以複製該問題的最小示例,那麼可以將問題作爲故障單提出,或者將討論發送到郵件列表。

+0

謝謝你的迴應,湯姆。如果查詢需要從請求中獲取值,我可以使用'queryset'屬性嗎?現在我正在使用'get_queryset()'。 – OrPo

+0

在'get_queryset'中使用select_related也可以。 –

+0

@TomChristie嗨,你能幫我嗎? http://stackoverflow.com/questions/26744664/django-tweak-the-rest-framework-serializer-to-getting-a-different-json-structure – Abhishek

相關問題