Django Academy · Lezione

ManyToManyField e modelli through

Collegare i record in entrambe le direzioni con dati aggiuntivi

Lezione 2 di 413 passaggi

ManyToManyField e modelli through è una lezione Django Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Django Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Django Academy include 4 lezioni in totale.

Molti da entrambe le parti

A volte ogni parte è collegata a molte istanze dell'altra: un post ha molti tag e un tag contrassegna molti post. Questa è una relazione molti-a-molti.

Dichiarare una ManyToManyField

Aggiunga una ManyToManyField che punti all'altro modello. Django gestisce automaticamente il collegamento in entrambe le direzioni.

class Post(models.Model):
    tags = models.ManyToManyField(Tag)

La tabella di collegamento nascosta

In background Django crea una tabella di collegamento che contiene coppie di id. Nessuna nuova colonna viene aggiunta ai due modelli.

Aggiungere relazioni

Dopo aver salvato un post, colleghi i tag con add. Può passare più oggetti contemporaneamente in una sola chiamata.

post.tags.add(python_tag, web_tag)

Rimuovere e cancellare i collegamenti

Rimuova un singolo collegamento con remove oppure li cancelli tutti con clear. Gli oggetti correlati rimangono intatti.

post.tags.remove(web_tag)
post.tags.clear()

Leggere l'insieme

Acceda alle righe collegate tramite il campo, come farebbe con un manager normale. Chiami all per scorrere tutto ciò che è collegato.

for tag in post.tags.all():
    print(tag.name)

Quando il collegamento richiede dati

E se un'appartenenza avesse informazioni proprie, come la data di iscrizione? Una semplice tabella di collegamento non può contenere colonne aggiuntive, quindi serve un controllo maggiore.

Il modello through

Un modello through è una tabella personalizzata per la relazione. Permette di associare campi aggiuntivi a ogni collegamento.

members = models.ManyToManyField(User, through="Membership")

Definire la classe through

Il modello through contiene una ForeignKey verso ciascuna delle due parti, oltre agli eventuali campi aggiuntivi. Queste colonne descrivono il collegamento stesso.

class Membership(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    joined = models.DateField()

add smette di funzionare

Con un modello through personalizzato, il semplice add è disabilitato. Per creare il collegamento deve invece creare direttamente una riga through.

Membership.objects.create(user=u, group=g, joined=today)

Eseguire query attraverso M2M

Filtri attraverso un collegamento molti-a-molti usando il doppio underscore, proprio come con una ForeignKey. Django gestisce la tabella di collegamento al posto suo.

Post.objects.filter(tags__name="python")

Verifica rapida

La sua appartenenza a un gruppo deve registrare la data di iscrizione di ogni utente. Quale soluzione usa?

Riepilogo

Ben fatto! Una ManyToManyField collega liberamente entrambe le parti, mentre un modello through permette a ogni collegamento di contenere i propri dati. 🏷️

Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «ManyToManyField e modelli through» è gratuita?

Sì — il testo completo di «ManyToManyField e modelli through» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Django Academy, passa a CoddyKit PRO. Il corso Django Academy include 4 lezioni in totale.

Cosa imparerò in «ManyToManyField e modelli through»?

Collegare i record in entrambe le direzioni con dati aggiuntivi Eserciti Django Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Django Academy?

Non è richiesta alcuna esperienza precedente. Django Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «ManyToManyField e modelli through»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Django Academy?

Sì. Ogni lezione Django Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. ForeignKey e on_delete
  2. ManyToManyField e modelli through
  3. OneToOneField per i profili
  4. related_name e ricerche inverse
← Torna a Django Academy