update_fields than simple save_user_profile example español complex better before python django save receiver

python - save_user_profile - simple is better than complex signals



Django: cuándo personalizar guardar vs usar señal de guardado posterior (2)

Tengo una serie de pruebas y casos en una base de datos. Cada vez que una prueba está obsoleta, tiene fecha de finalización, y cualquier subcaso de esa prueba también debe tener fecha de finalización. Veo dos maneras de lograr esto:

1) Modificar la función de guardar para los casos secundarios de la fecha de finalización.
2) Cree un receptor que escuche los modelos de prueba que se están guardando, y luego finalice las fechas de sus subcasos.

¿Alguna razón para usar uno que no sea el otro?

Edición: veo que esta publicación de blog sugiere usar el método de guardar cada vez que verifique los valores dados del modelo. Ya que estoy revisando la fecha de finalización, tal vez eso sugiera que debería usar un guardado personalizado.

Edit2 : Además, para el registro, la jerarquía completa es Protocol -> Test -> Case -> Planned_Execution, y cada vez que uno tiene fecha final, cada hijo también debe tener fecha final. Me imagino que terminaré haciendo básicamente lo mismo para cada uno.

Edit3 : Resulta que para saber si el guardado actual () es el que está finalizando la prueba, necesito tener acceso a los datos antiguos y los nuevos, así que utilicé un guardado personalizado. Esto es lo que parece:

def save(self): """Use a custom save to end date any subCases""" try: orig = Test.objects.get(id=self.id) enddated = (not orig.end_date) and self.end_date is not None except: enddated = False super(Test, self).save() if enddated: for case in self.case_set.exclude(end_date__isnull=False): case.end_date = self.end_date case.enddater = self.enddater case.save()


A mi entender, las señales son un medio para desacoplar los módulos. Ya que su tarea parece ocurrir en un solo módulo, personalizaría guardar.


Generalmente uso esta regla de oro:

  • Si tiene que modificar los datos para que la operación de guardar no falle, entonces invalide save() (no tiene otra opción). Por ejemplo, en una aplicación en la que estoy trabajando, tengo un modelo con un campo de texto que tiene una lista de opciones. Esto interactúa con el código antiguo y reemplaza un modelo anterior que tenía un campo de texto similar, pero con una lista diferente de opciones. El código antiguo a veces pasa a mi modelo una opción del modelo anterior, pero hay una asignación 1: 1 entre las opciones, por lo que en ese caso puedo modificar la opción a la nueva. Tiene sentido hacer esto en save() .
  • De lo contrario, si el proceso de guardado puede realizarse sin intervención, generalmente uso una señal de guardado posterior.