2017-02-24 57 views
0

我在DRF中有一個函數,我想告訴系統更新「所有人」,說我想給所有今天登錄的人一個免費獎,並且想要堅持這個列表(我得到這個例子是愚蠢的,它只是我試圖概括我的用例)。它將查詢以查看哪些用戶今天已經登錄,然後我想通過這些用戶循環來創建一個給他們獎勵的新活動。循環寫入到Django REST框架中的serializer.save()

這似乎只存儲在寫循環中的最後一個值。

  time_threshold = datetime.now() - timedelta(hours=12) 
      signed_in_list = Activity.objects.filter(created__gte=time_threshold, activity="signed in") 
      for activity in signed_in_list: 
       serializer.save(user=activity.user_id, activity="gets free prize") 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=status.HTTP_201_CREATED, 
        headers=headers) 

我試圖讓它從「signed_in_list」返回的每個用戶ID將有一個新的活動寫入。

我期待爲循環中的每個user_id寫一個新的Activity條目,但它只執行循環中的最後一個user_id。這讓我認爲serializer.save正在工作,但是每次都在循環中重寫(而不是寫入數據庫)。

回答

0

你指的「爲用戶」和「user.id」的時候,其實它不是一個用戶,那些你指的對象是活動的。

理想情況下,我希望看到你的序列化程序,但鑑於你已經通過了與queryset命令相同的參數,我假設序列化程序的模型是活動?

在這種情況下,您試圖使用與查詢集中返回的先前現有活動相同的主鍵ID來保存新活動。這是一個更新,但爲了在序列化程序上運行更新,Activity實例需要在初始化時傳遞給序列化程序。一般來說,無論是使用Django模型還是DRF序列化器,您都不需要傳遞id來保存,特別是不需要現有的id。

假設您有所謂的「用戶」的活動模型的外鍵參考的是用戶模型,你可以這樣做:

time_threshold = datetime.now() - timedelta(hours=12) signed_in_list = Activity.objects.filter(created__gte=time_threshold, activity="signed in") for activity in signed_in_list: serializer.save(user=activity.user, activity="gets free prize") headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

關於「用戶= activity.user」,作爲關鍵字參數傳遞到serializer.save(),這是您在保存模型時的做法。我認爲這與DRF序列化程序是一樣的,我不是100%確定,但如果它不起作用,您可以嘗試user = activity.user.id

+0

感謝您的評論,我覺得它混亂了,當我試圖讓它更通用的問題。我已經將其更正爲與您指出的代碼中的邏輯相匹配。它只是看起來像serializer.save只執行爲創建功能與這個循環 – probbins222

+0

內執行,每次在你上面的例子結束,它仍然只執行一個DB寫在列表中的最後一項。 – probbins222

0

我能解決這個問題。而不是serializer.save,我更新了請求並遞歸地調用我的創建函數

def create(self, request, *args, **kwargs): 
     time_threshold = datetime.now() - timedelta(hours=12) 
     signed_in_list = Activity.objects.filter(created__gte=time_threshold, activity="signed in") 
     for activity in signed_in_list: 
      request.data["user"] = activity.user 
      self.create(request, *args, **kwargs) 
     return Response(status=status.HTTP_201_CREATED)