¿Cómo hago que el campo de muchos a muchos sea opcional en Django?

202

Cuando tiene una relación de muchos a muchos ( related_nameno through) y está tratando de usar la interfaz de administración, debe ingresar una de las relaciones aunque no es necesario que cree la primera entrada.

Estoy creando una aplicación que es un organizador de eventos. Imagina que teníamos Eventy Groupmodelos, unidos con una relación de muchos a muchos.

Django related_namecrea otra tabla con los índices de las otras dos tablas.
Pero no veo razón para que esta mesa extra tiene a poblarse.

Si trabajo con la base de datos a través de phpMyAdmin, puedo crear un Groupsin registrar un Event, ya que la conexión entre los dos es solo a través de una tabla separada, y no hay cumplimiento de los valores de la base de datos en un nivel dado.

¿Cómo hago que la interfaz de administrador se dé cuenta?
¿Cómo hago que el campo de muchos a muchos sea opcional en Django?

DZ.
fuente

Respuestas:

348

Si desea poder especificar la relación ManyToMany sin que sea necesario, simplemente use blank=True:

class Group(models.Model):
    ...
    events = models.ManyToManyField(Event, blank=True)
Ludwik Trammer
fuente
77
Esto resuelve el problema. Usar el espacio en blanco no era tan obvio para mí porque pensé que muchos crearon una tabla que vincula los eventos con los grupos (eventos = modelos. el espacio en blanco ya que el Evento no es en realidad un campo en la tabla de grupo. De todos modos funcionó, así que gracias !!!
DZ.
9
@omouse Creo que sí, en blanco es para la validación de django y nulo para la base de datos. En este tipo de casos (como para IntegerField), no tiene sentido poner uno sin el otro, creo
lajarre
17
¿Realmente necesitas tener null=True? Tenía la impresión de nullque no tiene ningún efecto en los ManyToManycampos: stackoverflow.com/questions/18243039/…
Tyler Hayes
55
Sí, um @TylerHayes tiene razón. null = True es básicamente un no-op y no tiene sentido en el contexto de ManyToMany. Estoy abierto a que me muestren cómo me equivoco.
Ben Roberts el
77
null = True no es necesario, al menos desde Django 1.5 en adelante.
Ville Laurikari