首页 > 解决方案 > 使用 where 查询的 Django REST 框架部分更新

问题描述

我只想更新 id_payment = 1 的表的两个字段。怎么做?它向我显示了下面的错误。/receivePendingPayment/ 处的 IntegrityError(1048,“列 'bank_id' 不能为空”)

#View

    @permission_classes([IsAuthenticated])
    @api_view(['PATCH'])
    def receivePendingPayment(request):
        id_payment = request.data['id_payment']
        data = {'accountant_received_by': request.user.id, 'accounts_status': 'Received'}

        BankPaymentHistory.objects.filter(id=id_payment)
        serializer = BankPaymentUpdateSerializer(data=data, partial=True, many=False)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    #Serializer

    class BankPaymentUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = BankPaymentHistory
        fields = ('accounts_status','accountant_received_by')

    #Model

    class BankPaymentHistory(models.Model):
        activation_enum = (('Active', 'Active'), ('Deactive', 'Deactive'))
        accounts_status_enum = (('Pending', 'Pending'), ('Received', 'Received'))
        bank = models.ForeignKey(Bank, on_delete=models.CASCADE)
        project = models.ForeignKey(Project, on_delete=models.CASCADE)
        file = models.ForeignKey(File, on_delete=models.CASCADE)
        salesperson = models.ForeignKey(SalesPerson, on_delete=models.CASCADE)
        paymentmode = models.ForeignKey(PaymentModes, on_delete=models.CASCADE)
        amount = models.PositiveIntegerField()
        chequeno = models.CharField(max_length=50, unique=True)
        chequedate = models.DateField()
        paymentdate = models.DateField()
        remark = models.TextField(blank=True, null=True)
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        accountant_received_by = models.ForeignKey(User, related_name='%(class)s_accountant_received_by', on_delete=models.CASCADE, null = True)
        accountant_received_date = models.DateTimeField(default=datetime.now)
        create_date = models.DateTimeField(default=datetime.now)
        activation_status = models.CharField(max_length=20, choices=activation_enum, default='Active')
        accounts_status = models.CharField(max_length=20, choices=accounts_status_enum, default='Pending')

标签: djangodjango-rest-frameworkdjango-views

解决方案


将一个实例传递给序列化程序,这样它就可以知道它应该进行更新。

 instance = BankPaymentHistory.objects.filter(id=id_payment).first()
 serializer = BankPaymentUpdateSerializer(instance=instance, data=data, partial=True, many=False)

推荐阅读