1

I want to update my models by an editable plotly dash-table (populated by a dataframe, himself populated by sqlconnection with models) in Django but I don't know how to :/ You will see my trials in code comments, but obviously, it doesn't work. Any solution for this pls?

Here a class in exemple in models.py (same structure for each class):

class interventions_acm1(models.Model):
    date_debut = models.CharField(max_length=30, null=True)
    date_fin = models.CharField(max_length=30, null=True)
    titre_intervention = models.CharField(max_length=30, null=True)
    cout = models.CharField(max_length=30, null=True)
    responsable_acm = models.CharField(max_length=30, null=True)
    entreprise_exec = models.CharField(max_length=30, null=True)
    descriptif = models.CharField(max_length=150, null=True)

And views.py which contain table and connection with models:

from django_plotly_dash import DjangoDash
import dash_html_components as html
import dash_table
import dash_core_components as dcc
from dash.dependencies import Input, Output, State
import pandas as pd
from django.db import connection
from django.db.models import Q
from django.shortcuts import render
from django.http import HttpResponse
from .models import interventions_acm1, interventions_acm4, interventions_acm5, interventions_acm9, interventions_acm10
#from sqlalchemy import create_engine

# Create your views here.
def interventions(request):


    #table_data = table_donnees()
    app = DjangoDash('Tableau_intervention')

    
    Magasin_interventions_real = request.GET.get('Magasin_interventions_real')
    Annee_mois_dispo_interv = request.GET.get('Annee_mois_dispo_interv')

    #if Magasin_data_query != '':

    query = str(interventions_acm1.objects.all().query)
    if Magasin_interventions_real == 'ACM1':
    
        query = str(interventions_acm1.objects.all().query)
        

    elif Magasin_interventions_real == 'ACM4':
    
        query = str(interventions_acm4.objects.all().query)

    elif Magasin_interventions_real == 'ACM5':
    
        query = str(interventions_acm5.objects.all().query)

    elif Magasin_interventions_real == 'ACM9':
    
        query = str(interventions_acm9.objects.all().query)

    elif Magasin_interventions_real == 'ACM10':
    
        query = str(interventions_acm10.objects.all().query)

    
    df_interventions_real = pd.read_sql_query(query, connection)

    def annees_mois_dispo_interventions():
        ann_mois_dispo = (df_interventions_real["date_fin"]).str[:-3].unique().tolist()
        return (ann_mois_dispo)

    annee_mois_dispo_interventions = annees_mois_dispo_interventions()
    date_mois = "2022-03"
    date_mois = Annee_mois_dispo_interv
    #date_mois = ["2022-03","2022-01"]
    df_interventions_real = df_interventions_real[df_interventions_real['date_fin'].str.contains(date_mois)]


    PAGE_SIZE = 10

    #nmb_clicks = 0
    app.layout = html.Div([
        #dcc.Store(id='click-memory', data = {'nmb_clicks': nmb_clicks}),
        dash_table.DataTable(
            id='adding-rows-table',
            columns=[{'id': i, 'name': i} for i in df_interventions_real.columns],
            data=df_interventions_real.to_dict('records'),
            editable=True,
            row_deletable=True,
            page_size=10,  # we have less data in this example, so setting to 20
            style_table={'height': '195px', 'overflowY': 'auto'},
            style_header={
            'backgroundColor': 'white',
            'fontWeight': 'bold'
        },
        ),
    ])
    #mysql_str = f'mysql://{"dbadmin"}:{"adm%acm"}@{"localhost"}:{"3306"}/{"djangodatabase"}'
    #cnx = create_engine(mysql_str)
    #@app.callback(Output('adding-rows-table', 'columns'),
    #            [State('click-memory', 'data')])
    #def update_dropdown(click, name, data):
    #    if click != data['nmb_clicks']:
    #        if name not in df_interventions_real.columns:
    #            df_interventions_real[name] = [float('nan')] * len(df_interventions_real.index)
    #            new_df = df_interventions_real[0:1]
    #            data.to_sql('interventions_acm1', con=cnx, if_exists='replace')
    #    #return [{"name": i, "id": i} for i in df_interventions_real.columns]
    #    return new_df
    #@app.callback(Output('click-memory', 'data'),
    #            [State('click-memory', 'data')])
    #def on_data(click, data):
    #    if click != nmb_clicks:
    #        data['nmb_clicks'] = data['nmb_clicks'] + 1
    #
    #    return data

    if __name__ == '__main__':
        app.run_server(debug=True)

    return render(request, 'interventions/interventions.html',{'annee_mois_dispo_interventions':annee_mois_dispo_interventions})

Thank you in advance for your help

Thibault L
  • 15
  • 5

1 Answers1

0

I was facing a similar problem, the solution I came up with was to use sqlalchemy to connect to the sql database and write to it using df.to_sql. In my instance I just needed two lines:

engine = sqlalchemy.create_engine('sqlite:///db.sqlite3', echo=False)

df.to_sql('SQL Table name', con=engine)
user11717481
  • 1
  • 9
  • 15
  • 25