Almacenar el historial versionado de Field en un modelo Django

Tengo un modelo con un campo de texto, que necesita ser versionado.

class Book(models.Model): title = models.CharField(max_length=100) summary = models.TextField() 

El comportamiento esperado es el siguiente:

  • Si creo un libro nuevo con un resumen, el texto se guardará normalmente
  • Si el resumen se actualiza, el estado anterior debe almacenarse en algún lugar con un número de versión y una marca de tiempo
  • Debe ser fácilmente posible consultar las versiones actuales, un rango o específicas
  • Solo se debe versionar el summary del campo, no todo el modelo

Cómo debería hacer esto?

Lo tengo yo mismo.

Primero crea un nuevo modelo llamado SummaryHistory :

 class SummaryHistory(models.Model): version = models.IntegerField(editable=False) book = models.ForeignKey('Book') text = models.TextField() class Meta: unique_together = ('version', 'book',) def save(self, *args, **kwargs): # start with version 1 and increment it for each book current_version = SummaryHistory.objects.filter(book=self.book).order_by('-version')[:1] self.version = current_version[0].version + 1 if current_version else 1 super(SummaryHistory, self).save(*args, **kwargs) 

Ahora extienda el modelo inicial de la siguiente manera:

 class Book(models.Model): title = models.CharField(max_length=100) summary = models.TextField() def summary_history(self): return SummaryHistory.objects.filter(book=self).order_by('-version') def save(self, *args, **kwargs): super(Book, self).save(*args, **kwargs) # save summary history summary_history = self.summary_history() if not summary_history or self.summary != summary_history[0].text: newSummary = SummaryHistory(book=self, text=self.summary) newSummary.save() 

Ahora, cada vez que actualice un libro, se creará una nueva versión incrementada del resumen para el libro específico a menos que no haya cambiado.