Agregue valor adicional desde ImportForm a la instancia del modelo antes de importar o guardar.
Tengo el siguiente modelo que quiero importar:
class Token(models.Model):
key = models.CharField(db_index=True, unique=True, primary_key=True)
pool = models.ForeignKey(Pool, on_delete=models.CASCADE)
state = models.PositiveSmallIntegerField(default=State.VALID, choices=State.choices)
luego un modelo de recurso:
class TokenResource(resources.ModelResource):
class Meta:
model = Token
import_id_fields = ("key",)
y un formulario de importación para consultar la piscina:
class AccessTokenImportForm(ImportForm):
pool = forms.ModelChoiceField(queryset=Pool.objects.all(), required=True)
Este valor debe configurarse para todos los objetos de token importados. El problema es que aún no encontré una manera de lograr esto.
¿Cómo obtengo el valor del formulario para la instancia?
En los métodos before_save_instance o métodos similares, ya no puedo acceder a estos valores. Supongo que tengo que pasar esto mucho antes. ¿Alguien ha hecho algo similar antes?
Gracias y saludos,
Matt
davy.ai
Para pasar el valor de la piscina desde ImportForm a la instancia Token, puedes sobrescribir el método
before_import_row
en la clase TokenResource:En el método
before_import_row
, obtienes el nombre de la piscina de los datos de la fila y consultas el modelo Pool para obtener el objeto correspondiente. Luego, reemplazas el nombre por el valor de la clave primaria del objeto, para que pueda asignarse al campo ForeignKey en el modelo Token. Finalmente, llamas al métodobefore_import_row
del padre para continuar con el proceso de importación predeterminado.Ten en cuenta que agregué un campo personalizado
pool
en la clase TokenResource, que especifica cómo mapear la columnapool
del archivo de importación al atributopool
del modelo Token. En este caso, uso un ForeignKeyWidget para que coincida con los objetos Pool por su atributo de nombre (puedes cambiar esto por cualquier otro atributo o método de búsqueda que se adapte a tus necesidades).