繁体   English   中英

django-rest-framework:如何表示多对多关系?

[英]django-rest-framework: how to represent many-to-many relationship?

我正在构建一个带有rest api的django应用程序,用户可以在其中订阅订阅源。

我的模型如下所示:

class Profile(models.Model):
    user = models.OneToOneField(
        User, # standard django user
        on_delete=models.CASCADE,
        primary_key=True
    )

    subscriptions = models.ManyToManyField(Feed, related_name="subscribers")

class Feed(models.Model):
    # These feeds are read-only for the subscribers
    pass

用英语解释:

每个用户都有一个个人资料。 这些个人资料可以订阅供稿。 提要只能被订阅,用户不能创建或更新。

我想公开一个休息端点,以便为当前用户创建,读取,更新和删除订阅。 当然,我很乐意使用通用视图, ListCreateAPIViewRetrieveUpdateDeleteAPIView ,但是我不知道如何制作正确的序列化器和查询集以使其易于使用。

我最后以/me/subscriptions/直接返回Feed列表,但是POST很奇怪,因为它会创建一个Feed而不是创建订阅。

我很困惑...任何提示,不胜感激!

您可以使用ModelViewSet并覆盖create方法:

views.py:

from rest_framework import status
from rest_framework import viewsets


class FeedViewSet(serializers.ModelViewSet):  

    serializer_class = FeedSerializer

    def get_queryset(self):
        # show an only related Feed objects to a request.user
        profile = request.user.profile
        return Feed.objects.filter(subscribers=profile)

    def create(self, request, *args, **kwargs):
        pk = request.data.get('pk')
        profile = request.user.profile
        feed = Feed.objects.get(pk=pk)
        profile.subscriptions.add(feed)
        return Response('subscription feed updated!', status=status.HTTP_201_CREATED) 

    # list will work by default
    # other methods like update, delete, retrieve 
    # you could set with NOT_IMPLEMENTED status
    def update(self, request, *args, **kwargs):
        return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

urls.py:

from rest_framework import routers

router = routers.SimpleRouter()
router.register('subscriptions', FeedViewSet, base_name='subscription')

现在,您将拥有一个用于根据request.user更新Profile订阅的端点。 GET/subscriptions/将显示所有Feed由过滤的对象request.userPOST数据{'pk': <Feed_pk>}/subscriptions/将创建之间的链路FeedProfile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM