【问题标题】:DRF update view with many to many field具有多对多字段的 DRF 更新视图
【发布时间】:2021-12-21 18:37:22
【问题描述】:

我正在尝试编写更新视图,但出现错误请帮助我找到问题,谢谢 :) 起初我的模型中有很多字段。这是我的模型

    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'

【问题讨论】:

    标签: api django-models django-rest-framework django-views many-to-many


    【解决方案1】:

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

    
        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)
    

    这是网址

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

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多