具有多对多字段的 DRF 更新视图

DRF update view with many to many field

正在尝试编写更新视图,但出现错误请帮助我找到问题所在,谢谢 :) 起初我的 model.It 是我的模型

中的多对多字段
    class Portfolio(models.Model):
    name = models.CharField(max_length=50, unique=True, blank=False, null=True)
    market = models.ForeignKey(Market, on_delete=models.DO_NOTHING, related_name='market')
    investor = models.ForeignKey('accounts.User', on_delete=models.DO_NOTHING, related_name='investor')
    assets = models.ManyToManyField(Assets, related_name='assets')

    

    def __str__(self):
        return self.name

之后我有一个序列化程序供我查看:


    class PortfolioSerializer(serializers.ModelSerializer):

    class Meta:
        model = Portfolio
        fields = ['name', 'market', 'investor', 'assets']

这是我的观点:


    class PortfolioUpdateView(APIView):
    serializer_class = PortfolioSerializer

    def put(self, request, *args,):
        data = request.data
        portfo = Portfolio.objects.get(id=id)
        print(portfo)

        serilize = self.serializer_class(instance=request.user, data=request.POST)

        if serilize.is_valid():

            name = serilize.data['name']
            market = Market.objects.get(pk=int(request.POST.get('market', '')))
            assets = Assets.objects.get(pk=int(request.POST.get('assets', '')))

            Portfolio.objects.update(name=name, market=market,
                                     assets=assets,
                                     )

            return portfo
        else:
            pass

最后是我的错误:

类型错误 /market/update/1 put() 得到了一个意外的关键字参数 'id'

我自己找到了答案,因为我需要使用id来获取obj,所以我使用了request.data,即对象的主体数据包括obj的id,并添加了查询集方法来获取class对象


    class PortfolioUpdateView(viewsets.ModelViewSet):
    serializer_class = PortfolioSerializer

    def get_queryset(self):
        portfolio = Portfolio.objects.all()
        return portfolio

    def put(self, request, *args, **kwargs):
        data = Portfolio.objects.get(id=request.data['id'])
        update_portfolio = Portfolio.objects.update(name=data['name']
                                                    , market=Market.objects.get(pk=int(request.POST.get('market', ''))))

        update_portfolio.save()
        for asset in data['assets']:
            asset_obj = Assets.objects.update(asset_name=asset['asset_name'])
            update_portfolio.assets.add(asset_obj)

        serializer = PortfolioSerializer(update_portfolio)
        return Response(serializer.data)

这是 URL


   router.register("update", PortfolioUpdateView, basename="update")