Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何向django rest框架公开模型方法_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python 如何向django rest框架公开模型方法

Python 如何向django rest框架公开模型方法,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我有一个婚礼邀请模型,它有一个拒绝和接受邀请的方法,如下所示: 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

我有一个婚礼邀请模型,它有一个拒绝和接受邀请的方法,如下所示:

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框架,以便它可以作为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中公开以下端点:

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

希望这有助于为您指明正确的方向。

对于
WeddingViite
模型,如何使用
ModelSerializer
,以及接受POST或PUT请求的
APIView
,如果序列化器有效,则调用该方法?您还需要一个get\u object方法来检索特定的
WeddingVite
。我知道我必须调用get\u object方法,但是accept方法呢?我只需要执行self.accept来接受,self.谢绝来拒绝。还有,我如何定义URLST感谢您的回复。这可以在婚礼邀请的详细视图中完成,同时使用婚礼邀请列表的相同序列化程序类吗?是的,这是可能的。将response字段添加到ModelSerializer,post/put请求根据条件调用所需的方法。@user1362215它应该在response对象中,修复了回答中的错误。