example - type models django
¿Puede ser genérico un campo generic.GenericForeignKey() nulo? (4)
¿Has intentado establecer null=True
en GenericForeignKey
? Las claves externas genéricas no son un concepto reconocido por la aplicación de base de datos de bajo nivel (es decir, MySQL, SQLite, etc.) por lo que debería poder especificar que el campo sea nulo.
null=True
en un campo de base de datos en Django significa que el campo de la base de datos que representa esos datos está vacío, mientras que blank=True
le dice a los formularios de Django / validación del modelo que el campo está vacío para dejarlo vacío (o usted, a través de la interfaz de administración). Por lo tanto, es posible que necesite usar ambos para lograr lo que busca.
Estoy creando un objeto que rastrea los cambios (Actualizaciones) con respecto a la creación, actualización y eliminación de otros objetos denominados UUIDSyncable
en la base de datos.
Esto implica que cualquier objeto que extienda los UUIDSyncable
save()
y delete()
las clases UUIDSyncable
sea reemplazado, de tal forma que cree un nuevo objeto Update
models.CharField(max_length=64)
la acción (inserte, actualice o elimine) y originalmente un models.CharField(max_length=64)
campo que especifica el UUID pk de de los objetos UUIDSyncable
.
En este punto, quería actualizar la implementación para usar el campo generic.GenericForeignKey()
Django en lugar de mi campo de carácter único. Esto permitiría acceder al objeto sobre el que se está grabando la actualización de una manera mucho más simple.
Mi problema surge cuando desea eliminar un objeto y almacenarlo como un objeto de Update
, ya que sabe que Django preforma una eliminación en cascada en el objeto UUIDSyncable
que se está eliminando, borrando todos los registros de Update
previos (que no se desean).
Cuando el objeto UUIDSyncable
se ha eliminado en mi implementación original, cada objeto Update
aún conservará el UUID para informar a las partes externas sobre su eliminación. Mi primera solución para emular esto fue establecer content_object = None
justo antes de eliminar el objeto en todos los objetos de Update
, evitando así la cascada de eliminación.
Considera que generic.GenericForeignKey()
no se puede configurar para permitir valores NULL
. ¿Hay alguna manera de hacer esto o, de no ser así, cómo se puede utilizar de forma similar un CharField
estándar que CharField
una clave primaria UUID y un CharField
contiene el nombre del modelo?
Lo que dijo Daniel Roseman está bien. Solo asegúrese de actualizar su base de datos para permitir Null en esos campos, ya que puede haber creado la tabla sin configurarla.
Para los perezosos / pragmáticos:
class MyModel(models.Model):
...other fields...
content_type = models.ForeignKey(ContentType, blank=True, null=True, on_delete=models.SET_NULL)
object_id = models.PositiveIntegerField(blank=True, null=True)
content_object = generic.GenericForeignKey(''content_type'', ''object_id'')
Quizás necesite establecer null = True en los campos subyacentes content_type
y object_id
que conforman la clave externa genérica.