Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django rest框架:如何表示多对多关系?_Python_Django Rest Framework_Many To Many - Fatal编程技术网

Python django rest框架:如何表示多对多关系?

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

我正在构建一个带有RESTAPI的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
以英文解释:

每个用户都有一个配置文件。这些配置文件可以订阅提要。这个 订阅源只能订阅,不能由创建或更新 用户

我想公开一个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
方法,因为您的目的是创建链接而不是创建对象