Python django rest框架:如何表示多对多关系?
我正在构建一个带有RESTAPI的django应用程序,用户可以在其中订阅提要 我的模型如下所示:Python django rest框架:如何表示多对多关系?,python,django-rest-framework,many-to-many,Python,Django Rest Framework,Many To Many,我正在构建一个带有RESTAPI的django应用程序,用户可以在其中订阅提要 我的模型如下所示: class Profile(models.Model): user = models.OneToOneField( User, # standard django user on_delete=models.CASCADE, primary_key=True ) subscriptions = models.ManyToMa
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
以英文解释:
每个用户都有一个配置文件。这些配置文件可以订阅提要。这个
订阅源只能订阅,不能由创建或更新
用户
我想公开一个rest端点来为当前用户创建、读取、更新和删除订阅。当然,我喜欢使用泛型视图,ListCreateAPIView
和RetrieveUpdateDeleteAPIView
,但我不知道如何创建正确的序列化程序和查询集,使其易于使用
我最终直接返回了一个提要列表,但是POST
很奇怪,因为它会创建提要而不是创建订阅
我很困惑。。。任何提示都将不胜感激 您可以使用
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)
URL.py:
from rest_framework import routers
router = routers.SimpleRouter()
router.register('subscriptions', FeedViewSet, base_name='subscription')
现在,您将拥有一个端点,用于根据
请求更新配置文件的订阅。user
GET
to/subscriptions/
将显示按请求筛选的所有Feed
对象。用户
和POST
使用数据{pk':}
to/subscriptions/
将在Feed
和配置文件
之间创建链接 基于请求的用户配置文件。用户
?例如,GET
/subscriptions/
应该返回该用户的订阅Feed
,并且POST
应该创建指向该用户的mtm链接?这听起来是一个合理的解决方案。但我想知道,如果我在多对多关系中定义了一个贯穿对象,然后尽可能地公开它,是否会更容易/更少编写代码。@aspyct没有区别,通过您仍然需要重写create
方法,因为您的目的是创建链接而不是创建对象