[ninux-dev] django question

Giuseppe De Marco demarcog83 at gmail.com
Wed Dec 23 11:46:05 CET 2015


Il 23 dicembre 2015 10:10, leonardo <mail at leonardo.ma> ha scritto:
>
> Ciao lista,
>
> volevo fare un aggeggio che monitora la qualita' dei nostri link, fa
> qualche stima di dettaglio, aggiunge i tempi di ping che misuriamo con
> uno script a parte ecc... mi e' venuto in mente di provare a farlo in
> django, anche perche' cosi' se la cosa viene bene posso farne un app
> per nodeshot. E' la prima volta che uso django, mi piace ma sono fermo
> da due ore su una cosa che sembra banale, magari voi mi date una
> dritta. Il codice e' il seguente, prende un netjson della rete e vuole
> popolare un mini-db di nodi e link:
>
>
> def refresh_db(json_url):
>       resp = urllib2.urlopen(json_url)
>       f = resp.read()
>       json_topo = json.loads(f)
>       s = Scan()
>       s.save()   # <---- save!
>       nodes = []
>       for node in json_topo['nodes']:
>           nodes.append(Node(node_id=node['id'],
>                        node_name=node['label'],
>                        last_scan=s))
>       for n in nodes:
>           n.save()  # <----- errore!
> ^^^^^^^^^^^^^^^^^^
>
> la riga in questione solleva il fatidico errore:
>
> save() prohibited to prevent data loss due to unsaved related object
> 'last_scan'.
>
> che a quanto ho capito succede se uno salva un oggetto con una
> relazione ad un altro oggetto, senza salvare il primo. Ora, l'oggetto
> scan io lo salvo, e non capisco cosa sto sbagliando.
>
>

Credo che se tu utilizzi al posto di Node() Node.objects.create stai
certo di salvare l'oggetto nel DB senza fare commit.
ovvero:

for node in json_topo['nodes']:
    nodes.append(Node(node_id=node['id'],
                 node_name=node['label'],
                 last_scan=s))

potrebbe diventare:

for node in json_topo['nodes']:
    nodo = Node.objects.create(node_id=node['id'],
node_name=node['label'], last_scan=s)
    nodes.append( nodo )

se lo vuoi salvare dopo (e chiudere la transazione dopo il for), prova così
for node in json_topo['nodes']:
    nodo = Node(node_id=node['id'], node_name=node['label'], last_scan=s)
    nodes.append( nodo )

così al save non dovresit avere eccezione.
Ad ogni modo non hai bisogno di due FOR, quella cosa non potresti
farla in un'unico ?

Due considerazioni sul modello:
Ragazzi ma le chiavi primarie vedo un CharField e un IntegerField...
Massiete/siamo sicuri ?
la PK per letteratura è un intero autoincrementale.

A chi piace la letteratura oltre a me ? :)


Il 23 dicembre 2015 10:10, leonardo <mail at leonardo.ma> ha scritto:
>
> Ciao lista,
>
> volevo fare un aggeggio che monitora la qualita' dei nostri link, fa
> qualche stima di dettaglio, aggiunge i tempi di ping che misuriamo con
> uno script a parte ecc... mi e' venuto in mente di provare a farlo in
> django, anche perche' cosi' se la cosa viene bene posso farne un app
> per nodeshot. E' la prima volta che uso django, mi piace ma sono fermo
> da due ore su una cosa che sembra banale, magari voi mi date una
> dritta. Il codice e' il seguente, prende un netjson della rete e vuole
> popolare un mini-db di nodi e link:
>
>
> def refresh_db(json_url):
>       resp = urllib2.urlopen(json_url)
>       f = resp.read()
>       json_topo = json.loads(f)
>       s = Scan()
>       s.save()   # <---- save!
>       nodes = []
>       for node in json_topo['nodes']:
>           nodes.append(Node(node_id=node['id'],
>                        node_name=node['label'],
>                        last_scan=s))
>       for n in nodes:
>           n.save()  # <----- errore!
> ^^^^^^^^^^^^^^^^^^
>
> la riga in questione solleva il fatidico errore:
>
> save() prohibited to prevent data loss due to unsaved related object
> 'last_scan'.
>
> che a quanto ho capito succede se uno salva un oggetto con una
> relazione ad un altro oggetto, senza salvare il primo. Ora, l'oggetto
> scan io lo salvo, e non capisco cosa sto sbagliando.
>
>
> ecco models.py:
>
>
> class Scan(models.Model):
>     scan_id = models.IntegerField(primary_key=True)
>     scan_time = models.DateTimeField(default=datetime.now)
>
>     def __str__(self):
>         return str(self.scan_id) + str(self.scan_time)
>
>
> class Node(models.Model):
>     node_id = models.CharField(max_length=15, primary_key=True)
>     node_name = models.CharField(max_length=200)
>     last_scan = models.ForeignKey(Scan)
>     last_logged = models.DateTimeField(default=datetime.now)
>
>     def __str__(self):
>         return self.node_name
>
>
> ciao,
> leonardo.
> _______________________________________________
> ninux-dev mailing list
> ninux-dev at ml.ninux.org
> http://ml.ninux.org/mailman/listinfo/ninux-dev



More information about the ninux-dev mailing list