如何在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
我该如何在视图或序列化器中启用接受和拒绝的方法呢?
补充一下:我知道有一个序列化器方法字段,但它返回的是一个值。我不确定这个能不能用,因为我的方法和这个例子中的不太一样,具体可以参考这个链接 序列化器方法字段。
如果能给我一些正确的方向或者其他方法的建议,那就太好了。
1 个回答
6
下面是未经测试的代码,这是一种我可能会采用的方法。
关于你的序列化器:
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')
希望这能帮助你找到正确的方向。