¿Cómo hacer que el campo de clave externa sea opcional en el modelo Django?

2 minutos de lectura

avatar de usuario de usuario1
usuario1

Tengo el siguiente código:

subject = models.ForeignKey(subjects)
location = models.ForeignKey(location)
publisher = models.ForeignKey(publisher)

Es posible que no tenga los tres valores de los libros. A veces puede que no conozca el tema, la ubicación o la editorial. En este caso quiero dejarlos vacíos.

Pero si existen valores, entonces necesito un cuadro de selección desde el cual seleccionarlos. es posible?

Avatar de usuario de Abid A
Cumplir con un

Claro, solo agrega blank=True, null=True para cada campo que desee que siga siendo opcional, como

subject = models.ForeignKey(subjects, blank=True, null=True)

  • ¿Se necesitan ambos? ¿Cuáles serían las desventajas de simplemente usar null=True?

    – Pabellón

    21 de enero de 2016 a las 8:15

  • @WardC La combinación de los dos es tan frecuente porque, por lo general, si va a permitir que un campo esté en blanco en su formulario, también necesitará que su base de datos permita valores NULL para ese campo. La excepción son CharFields y TextFields, que en Django nunca se guardan como NULL. Los valores en blanco se almacenan en la base de datos como una cadena vacía (”).

    – fang_dejavu

    20 de junio de 2016 a las 18:32

  • @Ward, ambos no son necesarios. Es suficiente usar solo null=True.

    – Arcilla Risser

    20 mayo 2017 a las 22:27


  • blank=True es importante para la validación de formularios. Permitirá una cadena vacía como entrada de usuario en este campo. null=True permitirá NULO valor en la columna de la base de datos.

    – cézar

    23 de agosto de 2018 a las 10:31

  • ¿Se requiere algo más si originalmente no tenía blank=True, null=True pero que hacer ahora con las migraciones aplicadas? Tengo esta situación y aunque el esquema se ve bien, el formulario de administración no permite espacios en blanco. Sin embargo, otros FK que permitían espacios en blanco originalmente funcionaban y no veo la diferencia.

    – JFlo

    9 oct 2018 a las 13:59

Avatar de usuario de Muhammad Zubair
muhammad zubair

Para lograr esto, el on_delete el argumento es necesario junto con blank=True y null=Truey sería mejor si lo haces de esta manera.

subject = models.ForeignKey(subjects, on_delete=models.SET_NULL, blank=True, null=True)

Necesitas configurar en blanco = verdadero y nulo=Verdadero a modelos.ForeignKey() para hacer que el campo de clave foránea sea opcional y on_delete también debe configurarse como se muestra a continuación:

my_field = models.ForeignKey(
    Parent_model, 
    blank=True, # Here
    null=True, # Here
    on_delete=models.CASCADE # Here
)

*Tenga cuidado, solo configure cualquiera de los dos blank=True o null=True a models.ForeignKey() no es suficiente para que el campo de clave externa sea opcional, por lo que debe configurar ambos.

Además, si quieres conseguir lo que quieres con modelos.OneToOneField()debe establecer los mismos argumentos que se muestran a continuación:

my_field = models.OneToOneField(
    Parent_model, 
    blank=True, # Here
    null=True, # Here
    on_delete=models.CASCADE # Here
)

¿Ha sido útil esta solución?