1

我正在使用 django rest 框架制作 API。如果我转到特定的 url,我只想更改模型中的一个字段,即读取字段

我的模型:

class Notification(PolymorphicModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_by = models.ForeignKey(ElsUser, on_delete=models.CASCADE, default=None, related_name="creatednotifications")
    created_on = models.DateTimeField(default=timezone.now)
    created_for = models.ForeignKey(ElsUser, on_delete=models.CASCADE, default=None, related_name="receivednotifications")
    read = models.DateTimeField(default=None, null=True, blank=True)
    message = models.CharField(default=None, blank=True, null=True, max_length=800)

我制作的 API 列出了登录用户的通知。

我要实现的是:

notification/<:id>/markread

notification/<:id>/markunread

如果我转到这个特定的 url,我想修改已读字段..例如,如果标记为未读,则设为 None。我还需要检查登录用户是否收到了带有该 ID 的通知。我知道基础知识以及如何创建 url

class NotificationMarkRead(generics.UpdateAPIView):
    serializer_class = NotificationSerializer

    def get_queryset(self):
        queryset =  Notification.objects.filter(created_for=self.request.user)

        return queryset 

class NotificationMarkUnread(generics.UpdateAPIView):
    serializer_class = NotificationSerializer

    def get_queryset(self):
        queryset =  Notification.objects.filter(created_for=self.request.user)

        return queryset 

    def update

我最初的尝试是覆盖 update_API 视图中的 put 方法

4

2 回答 2

1

写一个简单的函数:

@api_view(['PUT'])
def notification_toggle_read_status(request, pk, read_status):
    notification = Notification.objects.get(pk=pk)
    if read_status == 'markread':
        notification.read = timezone.now()
    else:
        notification.read = None
    notification.save(update_fields=['read'])
    serializer = NotificationSerializer(instance=notification)
    return Response(serializer.data)

使用这个 url 路径:

notifications/<int:pk>/<string:read_status>/

于 2019-02-22T12:28:09.670 回答
0

因为您已经编写了代码,DRF为什么不尝试使用viewset link。从前端只需通过 put 请求传递更新字段。

于 2019-02-22T13:07:04.833 回答