usar example español como python django django-models

python - example - django signals español



post_save en django para actualizar la instancia inmediatamente (2)

Intento actualizar inmediatamente un registro después de que se haya guardado. Este ejemplo puede parecer inútil, pero imagine que necesitamos usar una API después de guardar los datos para obtener información adicional y actualizar el registro:

def my_handler(sender, instance=False, **kwargs): t = Test.objects.filter(id=instance.id) t.blah = ''hello'' t.save() class Test(models.Model): title = models.CharField(''title'', max_length=200) blah = models.CharField(''blah'', max_length=200) post_save.connect(my_handler, sender=Test)

Por lo tanto, se supone que el campo ''extra'' debe establecerse en ''hola'' después de cada guardado. ¿Correcto? Pero no está funcionando.

¿Algunas ideas?


¿El manejador post_save no toma la instancia? ¿Por qué estás filtrando usando? Por qué no solo hacer:

def my_handler(sender, instance=False, created, **kwargs): if created: instance.blah = ''hello'' instance.save()

Su código existente no funciona porque se Test.objects.filter(id=instance.id) y Test.objects.filter(id=instance.id) devuelve un conjunto de consultas, no un objeto. Para obtener un solo objeto directamente, use Queryset.get() . Pero no necesitas hacer eso aquí. El argumento creado evita que se repita, ya que solo lo establece la primera vez.

En general, a menos que necesites usar señales de post_save, deberías anular el método save () de tu objeto de todos modos.


Cuando se encuentre usando una señal post_save para actualizar un objeto de la clase de remitente, es probable que deba sobreescribir el método de guardar. En su caso, la definición del modelo se vería así:

class Test(models.Model): title = models.CharField(''title'', max_length=200) blah = models.CharField(''blah'', max_length=200) def save(self, force_insert=False, force_update=False): if not self.blah: self.blah = ''hello'' super(Test, self).save(force_insert, force_update)