Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何从不同服务器的数据库中正确获取对象?_Python_Django_Database - Fatal编程技术网

在python中,如何从不同服务器的数据库中正确获取对象?

在python中,如何从不同服务器的数据库中正确获取对象?,python,django,database,Python,Django,Database,我正在尝试使用django使用机器学习和web服务器,我的web和机器学习服务器都使用相同的Docked postgres数据库。机器学习服务器创建机器学习模型,并使用pickle将其写入数据库。我在机器学习服务器上有一个回归器类,如下所示: class Regressor: def __init__(self): self.predictions = [] self.yTrue = [] self.predDiffs = []

我正在尝试使用django使用机器学习和web服务器,我的web和机器学习服务器都使用相同的Docked postgres数据库。机器学习服务器创建机器学习模型,并使用pickle将其写入数据库。我在机器学习服务器上有一个回归器类,如下所示:

class Regressor:
    def __init__(self):
        self.predictions = []
        self.yTrue = []
        self.predDiffs = []
        self.model = object
        self.name = ""
        #some methods below
def getPredictions(request):
    predictorArray = RegressorTable.objects.filter()
    finalPrediction = finalDecision(predictorArray, np.array([20]).reshape(-1, 1))
    context = {"prediction": finalPrediction}
    return render(request, "get_predictions.html", context=context)
我有一个类,它为orm技术创建了一个合适的数据库表

class RegressorTable(DeclarativeBase):
    __tablename__ = "ml_models"

    id = Column(Integer, primary_key=True)
    regressorName = Column(String)
    regressorModel = Column(LargeBinary)
在机器学习和django web服务器中,我有两个函数,用于将模型转换为二进制,将二进制转换为模型

def modelToBinary(model):
    return pickle.dumps(model)


def binaryToModel(data):
    return pickle.loads(data)
以下是我在机器学习服务器中为数据库保存回归模型的方法:

def saveModelsToDb(predictorArray):
    for predictor in predictorArray:
        predictorForTable = RegressorTable()
        predictorForTable.regressorName = predictor.name
        predictorForTable.regressorModel = modelToBinary(predictor)
        DBSession.add(predictorForTable)
        DBSession.commit()
上述代码中的Predictor数组包含回归器对象。 当我尝试在机器学习服务器中保存和加载模型时,我可以成功地保存、加载和使用我的回归器对象。 我有一个web服务器,下面是我的模型:

class RegressorTable(models.Model):
    regressorName = models.CharField(max_length=50)
    regressorModel = models.BinaryField()
    
    class Meta:
        db_table = "ml_models"
在views.py中,我有上面提到的modelToBinary和binaryToModel方法。 我有这样一个代码:

class Regressor:
    def __init__(self):
        self.predictions = []
        self.yTrue = []
        self.predDiffs = []
        self.model = object
        self.name = ""
        #some methods below
def getPredictions(request):
    predictorArray = RegressorTable.objects.filter()
    finalPrediction = finalDecision(predictorArray, np.array([20]).reshape(-1, 1))
    context = {"prediction": finalPrediction}
    return render(request, "get_predictions.html", context=context)
我可以在机器学习服务器中成功地保存、加载和使用Regressionor对象。在机器学习服务器中,我保存了回归器对象,并希望在django web服务器中使用它们。当我试图用上面的代码获取它们时,它会抛出一个异常

无法在上获取属性“回归器”


如何从django web服务器的数据库中正确加载机器学习服务器已保存到数据库中的Regressionor对象?

两个应用程序中的模块名和类名必须相同,因为
pickle
使用这些名称来确定如何恢复类实例

基于上的
,您的回归器类是在执行的主模块中定义的,这在Django中永远不会发生


在例如
regressor.py
中定义类(或者更好的是,类似
my\u ml\u library/regressor.py
的东西,其中
my\u ml\u library
在两个应用程序中是同一个包)–还请记住
pickle
不会保存函数定义,因此如果您进行的代码更改可能与旧数据不兼容,您需要重新培训您的模型。

谢谢您的回答,我尝试了您的建议,但不幸的是,它对我不起作用。您知道有没有其他方法可以不使用pickle而将对象保存到数据库中?如果它对您不起作用,恐怕您没有正确地实现它。根据数据的不同,还有其他的方法,但没有一种会那么方便。对不起,我误解了你的建议。你能告诉我在django项目中我应该在哪里添加my_ml_库包吗?它有这样的软件包:SalesPredictionWeb>sales\u prediction,SalesPredictionWeb,static,templates,venv,manage.py只要两个应用程序都可以将其作为
my\u ml\u库导入即可。谢谢,它对我来说很好用。