【问题标题】:making an API that adds instances to ManyToMany fields of a model in django rest framework制作一个 API,将实例添加到 django rest 框架中模型的 ManyToMany 字段
【发布时间】:2022-01-31 23:19:51
【问题描述】:

我正在制作一个电影观看网站,其中有用户和电影,并且用户模型有一个引用电影模型的 ManyToMany 字段。它称为 WatchList,经过身份验证的用户可以将他们想要的任何电影添加到此监视列表中。

我的问题是我想要一个只获取电影 ID 并将其添加到用户的观看列表的 API。

这些是我的模型和序列化程序,我正在尝试制作一个视图来实现这个 API。

# models.py
class Film(models.Model):
    filmID = models.AutoField(primary_key=True)
    title = models.CharField(max_length=150)
    # ...

class User(AbstractBaseUser, PermissionsMixin):
    userID = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100, unique=True, validators=[RegexValidator(regex="^(?=[a-z0-9._]{5,20}$)(?!.*[_.]{2})[^_.].*[^_.]$")])
    email= models.EmailField(max_length=100, unique=True,  validators=[EmailValidator()])
    name = models.CharField(max_length=100)

    watchList = models.ManyToManyField(Film)

    objects = UserManager()

    USERNAME_FIELD = 'username'
# serializers.py
class WatchListSerializer(serializers.ModelSerializer):
    class FilmSerializer(serializers.ModelSerializer):
        model = Film
        fields = ('filmID', 'title',)
        read_only_fields = ('filmID', 'title')

    film_set = FilmSerializer(read_only=True, many=True)

    class Meta:
        model = get_user_model()
        fields = ('userID', 'film_set')
        read_only_fields = ('userID',)
# views.py
class WatchListAddView(...):
    pass

可以更改序列化程序。但这种显示我想要的 api 是什么。身份验证部分已经处理完毕,因此假设对视图的任何请求都来自经过身份验证的用户。

【问题讨论】:

    标签: django django-rest-framework django-views django-serializer


    【解决方案1】:

    我不建议直接对此进行修补,而是创建一个单独的端点来向该字段添加删除数据。

    在您的情况下,它看起来像这样。我只展示了一个小的工作示例,您可以根据需要进行调整

    from django.shortcuts import get_object_or_404
    from rest_framework import viewsets
    from rest_framework.decorators import action
    from rest_framework.response import Response
    
    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
    
        @action(detail=True,
                methods=['POST'])
        def add_film_to_watch_list(self, request, **kwargs):
            film = get_object_or_404(klass=Film, filmID=kwargs.get('filmID'))
            user = self.get_object()
            user.watchList.add(film)
            return Response("Success")
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多