簡體   English   中英

如何將模型方法公開給django-rest-framework

[英]How to expose model methods to django-rest-framework

我有一個模型WeddingInvite,它有一個拒絕和接受邀請的方法,如下所示:

class WeddingInvite(models.Model):
     from_user=models.ForeignKey(User,related_name="person_inviting")
     to_user=models.ForeignKey(User,related_name="person_invited")
     wedding=models.ForeignKey(Wedding,related_name="wedding_invite")
     status=models.IntegerField(choices=CHOICES)

     def accept(self):

         attending=Attending(attendant=to_user,wedding=Wedding)
         attendant.save()

         self.status=1
         self.save()

         notification.send([self.to_user],"invite_accepted",{"invitation":self})


     def decline(self):
         self.status=2
         self.save()

如何將方法公開給視圖或序列化程序,以便人們可以通過django-rest-framework接受或拒絕它,以便它可以作為json傳遞? 這是序列化器和視圖:

class WeddingInviteList(generics.ListCreateAPIView):
     serializer_class=WeddingInviteSerializer


     def list(self,request,*args,**kwargs):
         wedding_invites=[]

         invited=request.user


         qs=WeddingInvite.objects.filter(Q(to_user=invited))
         for invite in qs:
             wedding_invites.append({invite.from_user,"invited you to a wedding ",invite.wedding})

         return Response(wedding_invites)    

class WeddingInviteSerializer(serializers.ModelSerializer):
      class Meta:
           model=WeddingInvite

如何在視圖或序列化程序中啟用接受和拒絕方法?

編輯:我意識到有一個序列化方法字段,但它返回一個值。 我不知道是否可以使用這個,因為我的方法與此示例序列化器方法字段不同

關於這種或任何其他方式的正確方向的一點將是非常有幫助的。

下面未經測試的代碼,這是我可能采取的方法。

對於序列化器:

class WeddingInviteResponseSerializer(serializers.Serializer):
    response = serializers.BooleanField(required=True)

對於您的視圖,您可以隨意添加更多驗證方法和用戶檢查。

from django.http import Http404
from rest_framework.views import APIView
from .models import WeddingInvite
from .serializers import WeddingInviteResponseSerializer


class WeddingInviteResponseView(APIView):
    serializer_class = WeddingInviteResponseSerializer

    def get_object(self, pk):
        try:
            return WeddingInvite.objects.get(pk=pk)
        except WeddingInvite.DoesNotExist():
            raise Http404

    def post(self, request, pk):
        serializer = self.serializer_class(data=request.DATA)

        if serializer.is_valid():
            response = serializer.data['response']
            invite = self.get_object(pk)

            if response.accept:
                invite.accept()
                return Response({'success': "Wedding Invited accepted"}) status=status.HTTP_200_OK)
            else:
                invite.decline()
                return Response({'success': "Wedding Invited declined"}) status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

最后,只需在您的網址中公開以下結束點:

url(r'^invite/(?P<pk>\d+)/response$', WeddingInviteResponseView.as_view(), name='wedding-invite-response')

希望這有助於指出你正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM