首页 > 解决方案 > Django:插入或更新数据库条目

问题描述

我创建了以下函数,我可以在其中创建一个新的数据库条目,或者如果event_pk已经存在则更新它。现在我调查了update_or_create. 但是,这在我的情况下不起作用,因为其他条目(yhat 等)总是不同的。你有没有更好的想法来写它,这样我就不会像现在这样重复自己了?我的另一个想法是,我可以将event=event_obj, yhat=event_forecast.get('yhat')等保存在 a 中dict并打开包装。但没有弄清楚这是如何工作的。

def insert_forecast_data_to_db(self) -> None:
    """Insert or update forecast data in database."""
    forecast_data = self.get_forecast_data()
    for event_pk, event_forecast in forecast_data.items():
        event_obj = Event.objects.get(pk=event)
        forecast_obj = Forecast.objects.filter(event=event_pk)
        if forecast_obj.exists():
            forecast_obj.update(
                event=event_obj,
                yhat=event_forecast.get('yhat'),
                yhat_lower=event_forecast.get('yhat_lower'),
                yhat_upper=event_forecast.get('yhat_upper'),
                img_key=event_forecast.get('img_key'),
            )
        else:
            Forecast.objects.create(
                event=event_obj,
                yhat=event_forecast.get('yhat'),
                yhat_lower=event_forecast.get('yhat_lower'),
                yhat_upper=event_forecast.get('yhat_upper'),
                img_key=event_forecast.get('img_key'),
            )

标签: pythondjango

解决方案


我想我刚刚想通了。这就是我的目标:

def insert_forecast_data_to_db(self) -> None:
    """Insert or update forecast data in database."""
    forecast_data = self.get_forecast_data()
    for event_pk, event_forecast in forecast_data.items():
        event_obj = Event.objects.get(pk=event_pk)
        data = {
            'event': event_obj,
            'yhat': event_forecast.get('yhat'),
            'yhat_lower': event_forecast.get('yhat_lower'),
            'yhat_upper': event_forecast.get('yhat_upper'),
            'img_key': event_forecast.get('img_key'),
        }

        forecast_obj = Forecast.objects.filter(event=event_pk)
        forecast_obj.update(
            **data
        ) if forecast_obj.exists() else Forecast.objects.create(**data)

推荐阅读