2009-09-27 12 views
7

Il secondo giorno della mia nuova vita con Django, per favore scusate la semplicità della mia domanda.Principiante: Django: aggiunta di risultati calcolati a Queryset prima di passare al modello

Ho una tabella DB esistente (accesso in sola lettura) che ho visualizzato correttamente i contenuti di una pagina Web utilizzando url, viste, modelli e tutto ciò che di positivo.

La sfida che ho è la tabella non contiene tutte le informazioni che ho bisogno di visualizzare. La tabella contiene i risultati dei test con le colonne, sampletime, samplevalue, sampleresult. Devo visualizzare diversi dati in base a ciò che calcolo da quelle colonne.

Il mio obiettivo finale è visualizzare queste informazioni come un grafico delle serie temporali utilizzando flotr. Per ora Id essere felice per scaricare solo i dati che ho bisogno di un tavolo su una pagina web. (Così posso visualizzare i dati risultanti)

Cosa Id piace passare al modello è,

  • jssampletime (l'oggetto SampleTime datetime convertito in javascript epoca ms)
  • ResultValue (rolling sum + - di samplevalue in base al fatto sampleresult era buono o cattivo)

io sto bene con la creazione jssampletime e resultva lue usando le funzioni def. Presumo che aggiungerei queste funzioni a views.py

Immagino che cosa ho bisogno di fare iterare su una query Impostare in views.py e memorizzare i risultati in una lista di dizionari che passo al modello. Qualcosa di simile (codice non testato).

views.py

# views.py 
# Sudo code to assit in asking the question 
from django.shortcuts import render_to_response 
from thing.reporter.models import Samples 

def _datetime_to_js(sampletime): 
    #.. date conversion epoch magic 
    return jsd_result 

def _rolling_sum(samplevalue,sampleresult): 
    #.. summing magic 
    return sum_result 

def dumptable(request): # The def that is called by urls.py 
    object_list = Samples.objects.all() 

    list_for_template = [] 
    for row in object_list: 
     jssampletime = _datetime_to_js(row.sampletime) 
     resultvalue = _rolling_sum(row.samplevalue,row.sampleresult) 
     list_for_template.append({'jssampletime':jssampletime,'resultvalue':resultvalue}) 

    return render_to_response('tabledump.html', {'result_list': list_for_template}) 

tabledump.html

# tabledump.html template 
{% block content %} 
    <h2>Results dumped to page for testing</h2> 
    <ul> 
    <table> 
    {% for result in result_list %} 
     <tr> 
     <td>{{ result.jssampletime }}</td> 
     <td>{{ result.resultvalue }}</td> 
     </tr> 
    {% endfor %} 
    </table> 
    </ul> 
{% endblock %} 

penso che questo avrebbe funzionato, ma non sono sicuro se è il modo in cui Django MVC.

è giusto che io,

  • calcolare il risultato che ho bisogno in views.py da interating su un risultato set di query?
  • passare il mio risultato a un modello come elenco di dict (è un set di query più di )?

Immagino che sto cercando alcuni suggerimenti di direzione e codice. Sono sulla buona strada? C'è un modo migliore ?

risposta

15

Se le informazioni che si stanno visualizzando sono in un modello, perché non aggiungere solo proprietà/metodi al modello per visualizzare le informazioni necessarie per uscirne? Quindi è possibile passare l'elenco/set di query effettivo al modello e chiamare i metodi come proprietà.

ad es.

class MyModel(models.Model): 
    model_field = models.CharField(max_length=255) 

    @property 
    def calculated_field(self): 
     return self._do_calculation(self.model_field) 

Se è necessario accedere a variabili di stato nel vostro ciclo, non dimenticare che è possibile allegare qualsiasi proprietà di un oggetto pitone. Questo può essere estremamente utile.Quindi, a suo avviso si potrebbe avere qualcosa di simile:

for row in object_list: 
    # update some variable we want to use in the template 
    row.newly_added_field = run_calculation(row, somevariable) 

Entrambi questi potrebbe poi possibile accedere all'interno del modello:

{% for result in result_list %} 
    <tr> 
    <!-- some stuff that displays the model directly --> 
    <td>{{ result.calculated_field}}</td> 
    <td>{{ result.newly_added_field}}</td> 
    </tr> 
{% endfor %} 
+0

eccellente. La tua risposta ha fatto più luce su modelli e querysets. Sto iniziando a prendere questa cosa di Django adesso. Piccoli passi Ora ho i dati che mi servivano da visualizzare su una pagina Web di base. Grazie Cory, novellino –

+0

sicuro, lieto che abbia aiutato. non dimenticare che puoi accettare la risposta ...;) – Cory

Problemi correlati