[英]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
用英语解释:
每个用户都有一个个人资料。 这些个人资料可以订阅供稿。 提要只能被订阅,用户不能创建或更新。
我想公开一个休息端点,以便为当前用户创建,读取,更新和删除订阅。 当然,我很乐意使用通用视图, ListCreateAPIView
和RetrieveUpdateDeleteAPIView
,但是我不知道如何制作正确的序列化器和查询集以使其易于使用。
我最后以/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.user
和POST
数据{'pk': <Feed_pk>}
到/subscriptions/
将创建之间的链路Feed
和Profile
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.