Salve a  tutti ragazzi, come va?

Dopo un lunghissimo periodo di assenza, sono tornato, con altri problemi.

Sta volta sto studiando Django. Ho lasciato perdere Drupal, perché i suoi progetti purtroppo sono farraginosi, a volte non si capisce bene cosa puoi fare e cosa non puoi.

Comunque, voglio costruire un sito web con Django, ma prima di farlo sto sperimentando in locale un po' di tecniche e, soprattutto, sto imparando.

Ho già creato un piccolo blog, seguendo un bel tutorial ed effettivamente non è stato difficile.

Ora però ho provato a creare dei modelli con delle relazioni fra di loro ed ho un problema: in realtà è risolvibile, ma vorrei capire se c'è modo di fare quello che interessa a me, vado a spiegarmi.


Ho tre modelli, Artist, Album e Song, di cui posterò tutto il codice in questo messaggio.

Per didattica, Artist non ha alcun tipo di relazione, quindi viene creato semplicemente digitando il nome e una breve BIO facoltativa.

Album e Song invece hanno due tipi di relazione: Album ha una relazione many-to-many con Song e Song ha una relazione One-to-one con Album

Quindi, ogni album ha tante song, ogni song appartiene ad un album.

Considerando che ho lasciato l'interfaccia di amministrazione così come la presenta il sistema, ho soltanto registrato i modelli in admin.py della mia app singers, così li posso vedere nell'interfaccia.

Quando aggiungo un artista nessun problema, lo aggiungo, lo salvo, tutto ok.

I problemi però sorgono quando inizio ad aggiungere un album: l'artista è stato già aggiunto in precedenza, quindi lo posso selezionare dalla casella relativa agli artisti del modello album.

Dallo stesso form, posso cliccare su Add per aggiungere canzoni, ma qui mi blocco, perché il campo ForeignKey di canzoni, che si riferisce all'album, non può essere selezionato finché l'album non viene salvato.

Fra l'altro è un campo richiesto, quindi, se non lo compilo, django non mi salva la song.

Parimenti, se decidessi di non renderlo obbligatorio (blank=True), ogni volta che aggiungo un album e le sue canzoni, dovrei andare canzone per canzone e dirgli a che album appartiene... Brutto!


Vi posto il codice di models.py. Attenzione, ho indentato con un solo spazio, non mi picchiate, lo sto scrivendo con notepad!


Naturalmente tutto è perfettibile, ho da studiare ancora, magari la soluzione è banale e io mi sono solo perso, non lo so.


# models.py

from django.db import models

class Artist(models.Model):
 name = models.CharField(max_length=60)
 bio= models.TextField(blank=True)
 def publish(self):
  self.save()
 def __str__(self):
  return self.name

class Song(models.Model):
 album_title = models.ForeignKey('Album',on_delete=models.CASCADE)
 tracknumber = models.IntegerField(primary_key=True)
 tracktitle = models.CharField(max_length=250)
 def publish(self):
  self.save()
 def __str__(self):
  return str(self.tracknumber)+" - "+self.tracktitle


class Album(models.Model):
 title = models.CharField(max_length=250)
 artist = models.ForeignKey(Artist,on_delete = models.CASCADE)
 notes = models.TextField(blank=True)
 tracks = models.ManyToManyField(Song)
 def publish(self):
  self.save()
 def __str__(self):
  return self.title+" di "+self.artist


Il metodo publish non serve a niente, lo posso anche togliere.

Se qualcuno mi dà una mano, o qualcosa da leggere, gliene sarò grato!

Germano

_______________________________________________
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python

Rispondere a