【问题标题】:DRF: UpdateAPI > 'int' object has no attribute 'save'DRF:UpdateAPI > 'int' 对象没有属性 'save'
【发布时间】:2021-09-16 06:53:45
【问题描述】:

我正在尝试创建一个 UpdateAPI 来更新我的模型。我需要遵守这个API schema

我尝试了以下方法:

api.py

class AlarmstichworteUpdateApi(ApiErrorsMixin, APIView):
    permission_classes = [IsAuthenticated]

    class InputSerializer(serializers.ModelSerializer):

        updated = serializers.DateTimeField()
        name = serializers.CharField(max_length=100)
        class Meta:
            model = AlarmstichworteConfig
            fields = (
                '__all__'
            )

    def put(self, request, id, *args, **kwargs):
        serializer = self.InputSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        update_alarmstichwort(id=id, **serializer.validated_data)

        return Response(status=status.HTTP_200_OK)

services.py

def update_alarmstichwort(
    *,
    id: int, 
    updated: datetime,
    name: str,
    ) -> AlarmstichworteConfig:

    alarmstichwort = alarmstichwort_by_id(id=id).update(
        name=name,
        updated=updated,
    )
    # alarmstichwort.full_clean()
    alarmstichwort.save()

    return alarmstichwort

selector.py

def alarmstichwort_by_id(*, id, filters=None):
    return AlarmstichworteConfig.objects.filter(id=id)

但是,我的问题是这不起作用。当我这样做时,我得到了错误:

  File "D:\04-Dev\project\{...}\services.py",
   line 48, in update_alarmstichwort
    alarmstichwort.save()
AttributeError: 'int' object has no attribute 'save'

你能帮我或告诉我错误是什么吗?提前谢谢你。

【问题讨论】:

    标签: python django django-rest-framework jwt


    【解决方案1】:

    .update(…) method [Django-doc] 返回更新记录的数量,而不是记录的(列表),因此您应该省略 .save() 部分:

    def update_alarmstichwort(
        *,
        id: int, 
        updated: datetime,
        name: str,
        ):
    
        alarmstichwort = alarmstichwort_by_id(id=id).update(
            name=name,
            updated=updated,
        )
    

    如果您想检索项目本身并返回(更新的)项目,您可以使用:

    from django.shortcuts import get_object_or_404
    
    def update_alarmstichwort(
        *,
        id: int, 
        updated: datetime,
        name: str,
        ) -> AlarmstichworteConfig:
    
        alarmstichwort = get_object_or_404(alarmstichwort_by_id(id=id))
        alarmstichwort.name = name
        alarmstichwort.updated = updated
        alarmstichwort.save(update_fields=['name', 'updated'])
        return alarmstichwort

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2015-11-16
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多