es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  ,

Answer

  1. Avatar for 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:

    class TokenResource(resources.ModelResource):
        pool = fields.Field(column_name='pool', attribute='pool', widget=ForeignKeyWidget(Pool, 'name'))
    
        class Meta:
            model = Token
            import_id_fields = ("key",)
    
        def before_import_row(self, row, **kwargs):
            pool_name = row['pool']
            pool = Pool.objects.get(name=pool_name)
            row['pool'] = pool.pk
            return super(TokenResource, self).before_import_row(row, **kwargs)
    

    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étodo before_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 columna pool del archivo de importación al atributo pool 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).

Comments are closed.