2016-08-12 43 views
1

我使用Django REST框架構建Web應用程序。有一個簡單的視圖,它返回帶有db字段的引用信息。
resources.py:瞭解Django中的VIew評估

RESOURCES = { 
    'genres': GenreSerializer(Genre.objects.all(), many=True).data, 
    'authors': AuthorSerializer(Author.objects.all(), many=True).data, 
    ...... 
    } 


class ResourceApiView(views.APIView): 

    def get(self, request): 
     params = request.query_params 
     response_dict = {} 
     if params: 
     # Return RESOURSES based on query params 
      for i in params: 
       q = RESOURCES.get(i) 
       if q: 
        response_dict[i] = q 
     else: 
     # Return all RESOURSES 
      response_dict = RESOURCES 
     return Response(response_dict, 
         status=status.HTTP_200_OK 
         ) 

它工作正常,但是當我添加新的對象到一個資源查詢集。沒有任何反應,它顯示舊的查詢。
我試過在我的模塊中打印RESOURSES,它打印一次,其他get請求不會觸發它。
然後,我直接在ResourceApiView類中移動RESOURSES,它的行爲與在模塊中的RESOURSES處相同。

class ResourceApiView(views.APIView): 

    RESOURCES = { 
     'genres': GenreSerializer(Genre.objects.all(), many=True).data, 
     'authors': AuthorSerializer(Author.objects.all(), many=True).data, 
     ...... 
     } 

    def get(self, request): 
     ... 

它做工精細,只有當我把RESOURSESget方法。

class ResourceApiView(views.APIView): 

    def get(self, request): 
     RESOURCES = { 
      'genres': GenreSerializer(Genre.objects.all(), many=True).data, 
      'authors': AuthorSerializer(Author.objects.all(), many=True).data, 
      ...... 
      } 

但爲什麼會發生?爲什麼我無法評估每個方法調用的類屬性查詢?

+1

因爲您的'RESOURCES'僅在服務器啓動時才被評估,另一方面,當您將其放入get方法中時,將針對每個請求進行評估。這就是爲什麼你有'queryset'屬性和'get_queryset'方法 – dnit13

回答

2

這與python比django更相關。比方說,你HAVA文件lib.py

def say_hello(): 
    print "hello" 

GREETINGS = { 
    "hello": say_hello() 
} 

現在去另一個Python文件(或外殼)和剛剛導入lib.py,因爲當你導入文件它首先解決了,你會打印「你好」到控制檯代碼裏面,所以它創建了GREETINGS變量(在你的情況下爲RESOURCES)並且調用了say_hello()方法,因爲它正在執行查詢。不過python非常聰明,如果你再次導入文件,他會記得你之前只是導入了它,所以它不會再加載模塊,因爲它已經保存了模塊引用。被beeing執行

您的查詢一次首次加載視圖時,和重新導入視圖不會使參考變化

同樣用於放置資源作爲類屬性。上課的時候是進口被執行的代碼

希望這澄清了:)但也許該文檔解釋了它(同樣,你可以通過在lib.py例如,創建一個類測試它)更好https://docs.python.org/2/tutorial/modules.html

注: 我認爲序列化程序上的.data實際上正在執行查詢。如果沒有它,你的查詢和序列化器就會被存儲爲參考,因爲ORM是懶惰的。因爲現在如果您請求一個資源(例如作者)仍然執行所有查詢('作者','流派'等),請改變您的資源以改進您的端點的性能。