Come posso rendere opzionale il campo molti-a-molti in Django?


202

Quando si ha una relazione molti-a-molti ( related_name, non through) e si sta tentando di utilizzare l'interfaccia di amministrazione, è necessario immettere una delle relazioni anche se non è necessario che esista per creare la prima voce.

Sto creando un'app che è un organizzatore di eventi. Immagina di avere modelli Evente Groupmodelli, legati da una relazione molti-a-molti.

Django related_namecrea un altro tavolo con gli indici degli altri due tavoli.
Ma non vedo alcun motivo per cui questo tavolo extra debba essere popolato.

Se lavoro con il database tramite phpMyAdmin, posso crearne uno Groupsenza registrarne uno Event, poiché la connessione tra i due avviene solo tramite una tabella separata e non esiste un'applicazione del valore del database a un determinato livello.

Come faccio a renderlo realizzato dall'interfaccia di amministrazione?
Come posso rendere facoltativo il campo molti-a-molti in Django?

Risposte:


348

Se vuoi essere in grado di specificare la relazione ManyToMany senza renderlo necessario, usa blank=True:

class Group(models.Model):
    ...
    events = models.ManyToManyField(Event, blank=True)

7
Questo risolve il problema. L'uso dello spazio vuoto non è stato così ovvio per me perché pensavo che molti hanno creato una tabella che collega gli eventi con i gruppi (events = models.ManyToManyField (Event, related_name = "groups", blank = True) Quindi non era chiaro da usare lo spazio in bianco poiché Event non è in realtà un campo nella tabella di gruppo. Comunque ha funzionato così grazie !!!
DZ.

9
@Mouse Penso di sì, vuoto è per la convalida di Django e null per il database. In questo tipo di caso (come per IntegerField) non ha senso metterne uno senza l'altro, credo
lajarre,

17
Hai davvero bisogno di avere null=True? Avevo l'impressione di nullnon avere alcun effetto sui ManyToManycampi: stackoverflow.com/questions/18243039/…
Tyler Hayes

5
Sì, um @TylerHayes ha ragione. null = True è fondamentalmente no-op ed è privo di senso nel contesto di ManyToMany. Sono aperto a essere mostrato come mi sbaglio.
Ben Roberts,

7
null = True non è richiesto, almeno da Django 1.5 in poi.
Ville Laurikari,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.